4

フルランクのNxM行列があると仮定します。ここで、 。列を(次元で)で表すと、行列は次のように記述できます。AM>NC_iNx1

A = [C_1, C_2, ..., C_M]

元の行列の最初の線形独立列を取得して、行列式がゼロ以外の可逆行列であるA新しいNxN行列を作成するにはどうすればよいですか。B

B = [C_i1, C_i2, ..., C_iN]

{i1, i2, ..., iN}matlabまたはpythonnumpyでインデックスを見つけるにはどうすればよいですか?これは、特異値分解を使用して実行できますか?コードスニペットは大歓迎です。

編集:これをより具体的にするために、次のPythonコードを検討してください

from numpy import *
from numpy.linalg.linalg import det

M = [[3, 0, 0, 0, 0],
     [0, 0, 1, 0, 0],
     [0, 0, 0, 0, 1], 
     [0, 2, 0, 0, 0]]
M = array(M)

I = [0,1,2,4]
assert(abs(det(M[:,I])) > 1e-8)

Nしたがって、行列Mが与えられると、線形独立な列ベクトルのセットのインデックスを見つける必要があります。

4

2 に答える 2

6

簡単、MATLABで簡単。QR、具体的にはピボットQRを使用します。

M = [3 0 0 0 0;
     0 0 1 0 0;
     0 0 0 0 1; 
     0 2 0 0 0]

[Q,R,E] = qr(M)
Q =
     1     0     0     0
     0     0     1     0
     0     0     0     1
     0     1     0     0

R =
     3     0     0     0     0
     0     2     0     0     0
     0     0     1     0     0
     0     0     0     1     0

E =
     1     0     0     0     0
     0     1     0     0     0
     0     0     1     0     0
     0     0     0     0     1
     0     0     0     1     0

Eの最初の4列は、使用されるMの列、つまり列[1,2,3,5]を指定します。Mの列が必要な場合は、製品M*Eを作成するだけです。

M*E
ans =
     3     0     0     0     0
     0     0     1     0     0
     0     0     0     1     0
     0     2     0     0     0

ちなみに、detを使用して行列が特異であるかどうかを判断することは、絶対に、積極的に、間違いなく最悪の方法です。

代わりにランクを使用してください。

基本的に、MATLABでdetを使用するのは、それがなぜそんなに悪いことなのかを理解していない限り、事実上絶対に使用しないでください。その事実にもかかわらず、detを使用することを選択します。

于 2010-08-22T03:12:43.357 に答える
1

私の最初の考えは、M列からNの可能な組み合わせをそれぞれ試すことです。これは(Pythonで)次のように実行できます。

import itertools
import numpy.linalg

# 'singular' returns whether a matrix is singular.
# You could use something more efficient than the determinant
# (I'm not sure what options there are in NumPy)
singular = lambda m: numpy.linalg.det(m) == 0

def independent_square(A):
    N,M = A.shape
    for colset in itertools.combinations(xrange(M), N):
        B = A[:,colset]
        if not singular(B):
            return B

結果の正方行列の代わりに列インデックスが必要な場合は、。に置き換えreturn Breturn colsetください。または、で両方を取得できますreturn colset,B

SVDがここでどのように役立つかはわかりません。実際、試行錯誤以外では、AをBに変換する純粋な数学演算(またはB = AQとなるようなMxN列選択行列Qを計算する演算)は考えられません。しかし、存在するかどうかを知りたい場合は、math.stackexchange.comがお問い合わせください。

必要なのが計算でそれを行う方法だけである場合は、上記のコードで十分です。

于 2010-08-21T22:00:19.877 に答える