簡體   English   中英

對於復雜值矩陣,多個特征值/特征向量似乎是錯誤的?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM