复数矩阵的Numpy特征值/特征向量似乎是错误的?

问题描述:

这可能是一件非常愚蠢的事情,但我在Numpy版本1.12.1中得到了一个相当奇怪的输出。我试图对角化一个随机对称矩阵,然后通过变换回对角线特征值矩阵来检查质量,但它似乎无法处理复杂的值。基本上:复数矩阵的Numpy特征值/特征向量似乎是错误的?

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时,我知道它适用于厄密矩阵,因为这是我经常使用的东西,但为什么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 
+0

啊,它这样工作,但实际上我的第一个实验只使用了'A + = A.T',这样做失败了。我知道在这种情况下,问题可能是特征值不是真实的,但是这应该是一个大问题? – Okarin

+0

是的,因为归一化特征向量矩阵的逆是它的复共轭,而不仅仅是转置,就像实值矩阵中的情况一样。对于'A + = AT',最终会得到一个对称的矩阵,即反对角线元素具有相同的值,但它将失去'对称'矩阵的性质,因为复共轭共轭转置)应该与原始矩阵相同。 – Uvar