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

时间:2017-10-05 16:04:09

标签: python numpy 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也会因对角线上的复杂值而失败?

1 个答案:

答案 0 :(得分:2)

您的问题的答案是您未能正确进行对角化/矩阵重建。

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