[英]Numpy eigenvalues/eigenvectors seem wrong for complex valued matrix?
這可能確實很愚蠢,但是使用Numpy版本1.12.1時,我得到了一個相當奇怪的輸出。 我正在嘗試對一個隨機對稱矩陣進行對角化,然后通過將對角特征值矩陣變回來檢查質量,但是對於復雜的值似乎失敗了。 基本上:
A = np.random.random((3, 3))
A += A.T.conj()
evals, evecs = np.linalg.eig(A)
print np.isclose(np.dot(evecs, np.dot(np.diag(evals), evecs.T)), A).all()
打印True
而
A = np.random.random((3, 3))+1.0j*np.random.random((3, 3))
A += A.T.conj()
evals, evecs = np.linalg.eig(A)
print np.isclose(np.dot(evecs, np.dot(np.diag(evals), evecs.T)), A).all()
打印False
。 我檢查了值,這似乎不僅是一些數字上的不正確,而且似乎是完全錯誤的。 我是從根本上做錯了嗎? 我知道當我使用np.linalg.eigh
時,它適用於Hermitian矩陣,因為這是我經常使用的東西,但是為什么對角線的復雜值也不能使用eig
進行eig
?
問題的答案是您沒有正確進行對角化/矩陣重建。
A = np.random.random((3, 3))+1.0j*np.random.random((3, 3))
A += A.T.conj()
evals, evecs = np.linalg.eig(A)
from scipy.linalg import inv
print(np.isclose(np.dot(evecs, np.dot(np.diag(evals), inv(evecs))), A).all())
會告訴您一個簡潔的True
,因為它是正確的公式。
現在,如果您打電話
print np.isclose(np.dot(evecs, np.dot(np.diag(evals), evecs.T)), A).all() #False
是您乘以特征向量矩陣的轉置,在實值歸一化特征向量矩陣的情況下有效。 幸運的是,歸一化的部分仍然是正確的,因此您需要做的只是模仿逆矩陣,就是采用矩陣的復共軛。
print(np.isclose(np.dot(evecs, np.dot(np.diag(evals), evecs.T.conj())), A).all()) #True
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.