繁体   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