这可能是非常愚蠢的事情,但是我得到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
也会因对角线上的复杂值而失败?
答案 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