2015-04-22 179 views
4

我在做一些矩陣計算,想要計算出這個特殊矩陣的特徵值和特徵向量:Numpy特徵向量不是特徵向量?

enter image description here

我找到了它的特徵向量分析,並希望確認使用numpy.linalg.eigh我的答案,因爲這個矩陣是對稱的。這裏的問題是:我找的預期特徵值,但對應的特徵向量似乎在所有

這裏不是特徵向量的代碼的小片我用:

import numpy as n 
def createA(): 
#create the matrix A 
    m=3 
    T = n.diag(n.ones(m-1.),-1.) + n.diag(n.ones(m)*-4.) +\ 
    n.diag(n.ones(m-1.),1.) 
    I = n.identity(m) 
    A = n.zeros([m*m,m*m]) 
    for i in range(m): 
     a, b, c = i*m, (i+1)*m, (i+2)*m 
     A[a:b, a:b] = T 
     if i < m - 1: 
      A[b:c, a:b] = A[a:b, b:c] = I 
    return A 

A = createA() 
ev,vecs = n.linalg.eigh(A) 
print vecs[0] 
print n.dot(A,vecs[0])/ev[0] 

所以對於第一特徵值/特徵向量對,此產率:

[ 2.50000000e-01 5.00000000e-01 -5.42230975e-17 -4.66157689e-01 
3.03192985e-01 2.56458619e-01 -7.84539156e-17 -5.00000000e-01 
2.50000000e-01] 

[ 0.14149052 0.21187998 -0.1107808 -0.35408209 0.20831606 0.06921674 
0.14149052 -0.37390646 0.18211242] 

以我的特徵值問題的理解,看來這種載體不足以等式A.vec = ev.vec,因此,該載體是無eige在所有的nvalue。

我很肯定矩陣A本身是正確實現的,並有一個正確的特徵向量。例如,我的分析導出的特徵向量:

rvec = [0.25,-0.35355339,0.25,-0.35355339,0.5,-0.35355339,0.25, 
-0.35355339,0.25] 
b = n.dot(A,rvec)/ev[0] 
print n.allclose(real,b) 

產量True

任何人都可以通過任何方式解釋這種奇怪的行爲嗎?我誤解了特徵值問題嗎?可能會出現錯誤嗎?

(由於這是我的第一篇文章在這裏:。我對我的問題任何unconventionalities道歉,感謝您在您的耐心)

回答

4

描述here的特徵向量被存儲爲列向量。所以,你必須使用vecs[:,0]代替vecs[0]

例如,這在這裏工作對我來說(我用eig因爲A不是對稱)

import numpy as np 
import numpy.linalg as LA 
import numpy.random 

A = numpy.random.randint(10,size=(4,4)) 
# array([[4, 7, 7, 7], 
#  [4, 1, 9, 1], 
#  [7, 3, 7, 7], 
#  [6, 4, 6, 5]]) 

eval,evec = LA.eig(A) 

evec[:,0] 
# array([ 0.55545073+0.j, 0.37209887+0.j, 0.56357432+0.j, 0.48518131+0.j]) 

np.dot(A,evec[:,0])/eval[0] 
# array([ 0.55545073+0.j, 0.37209887+0.j, 0.56357432+0.j, 0.48518131+0.j]) 
+0

就是這樣。 - 我覺得很傻,謝謝你,解決了一切! – JBouman

+0

@JBouman不要覺得自己是個笨蛋,numpy/scipy本徵向量作爲列而不是行是非常不規則的,並且沒有很好的文檔記錄......自己遇到這個問題並且在這個主題上探索了互聯網,這是一個非常常見的錯誤。 –