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