2016-09-12 9 views
1

私はnumpyを使って行列の固有ベクトルを計算していました。私はいくつかの奇妙な結果を得ていました。それから私はMatlabを使うことにしました。私はU.dot(U.T) = Iを期待していたので、Numpyが間違ったeigeinvectorsを計算する

L = np.array(([2,-1,-1],[-1,2,-1],[-1,-1,2])) 
Lam,U = np.linalg.eig(L) #compute eigenvalues and vectors 
#sort by ascending eigenvalues 
I = [i[0] for i in sorted(zip(xrange(len(Lam)),Lam),key=lambda x: x[1])] 
Lam = Lam[I] 
U = U[:,I] 
print U.dot(U.T) 

>> [[ 1.09 -0.24 0.15] 
    [-0.24 1.15 0.09] 
    [ 0.15 0.09 0.76]] 

結果が変でした。 MATLABで:何が起こっている

0.5774 0.7634 0.2895 
0.5774 -0.6325 0.5164 
0.5774 -0.1310 -0.8059 

[[-0.58 0.82 0.29] 
[-0.58 -0.41 -0.81] 
[-0.58 -0.41 0.51]] 

およびV:ところでUによって

L = [2,-1,-1;-1,2,-1;-1,-1,2] 
[V,D] = eig(L) 
V*V' 
ans = 
    1.0000 0.0000 -0.0000 
    0.0000 1.0000 0.0000 
    0.0000 0.0000 1.0000 

+1

確かまだ、何が起こっているが、ちょうど2つのヒントはありません基本的に 'np.argsort(Lam)'と 'zip(xrange(lam(Lam))、key = lambda(Lam) 、Lam) 'は'列挙(Lam) 'されています。 – swenzel

答えて

5

対称行列の固有ベクトルの正規直交基底があるのは間違いありませんが、Numpyがその基底を返すという保証はありません。それはベースの固有ベクトルを返します。このアプローチについては何も間違いありません。

あなたが見ている行列には、固有値3の2次元固有値と1次元カーネルがあります。カーネルについては、固有ベクトルは一定の係数まで決定される。しかし、2次元空間については、基底を選択する自由があり、それが正規直交であるという保証はありません。

対称行列の固有ベクトルの正規直交基底を得るには、numpy.linalg.eigh()を使用できます。

+0

グラムシュミットの正規化法が実装されていますか? –

+0

@ Ev.Kounis:Numpyではなく、私が知っている限り、http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.linalg.orth.htmlがあります。 。しかし、一般的に、正規直交固有ベクトルを必要とする場合は、特異値分解を使用します。 –

-2

私は問題はだからあなたの行列が可逆的ではないことを

np.linalg.det(L) # Return 0 
Lam # Return [3, 3, 0] 

だと思うのための: `[I [0]:

det(L * U) = det(L) * det(U) = 0 != det(I) = 1 
関連する問題