通过使用此命令“ np.linalg.eig(H * H)”来计算本征分解是否合适?

时间:2019-06-24 06:58:37

标签: python numpy linear-algebra

我正在学习这个post和这个post

我正在尝试使用Python NumPy像post那样重现计算结果。

H = np.array([[0.1, 0.3, .4],[0.5 , 0.5, 0.9],[0.1, 0.4, 0.5]])
u, s, vh = np.linalg.svd(H)
w, v = np.linalg.eig(H*H)

np.linalg.eig(H*H)与此结果post截然不同。

那为什么?

1 个答案:

答案 0 :(得分:0)

有两个问题。首先,您没有调换乘数。其次,您使用的是元素乘法而不是矩阵乘法。

这是解决两个问题的方法:

In [18]: np.linalg.eig(np.matmul(H, H.T))
Out[18]:
(array([1.94501343e+00, 1.14315435e-05, 4.49751401e-02]),
 array([[-0.35979589, -0.82953709,  0.42710084],
        [-0.81600749,  0.05780546, -0.57514373],
        [-0.4524143 ,  0.55545183,  0.69770664]]))

或者,您可以使用np.matrix来使*执行矩阵乘法:

In [22]: H = np.matrix([[0.1, 0.3, .4],[0.5 , 0.5, 0.9],[0.1, 0.4, 0.5]])

In [23]: np.linalg.eig(H*H.T)
Out[23]:
(array([1.94501343e+00, 1.14315435e-05, 4.49751401e-02]),
 matrix([[-0.35979589, -0.82953709,  0.42710084],
         [-0.81600749,  0.05780546, -0.57514373],
         [-0.4524143 ,  0.55545183,  0.69770664]]))

如果矩阵包含复数,则应使用共轭转置(.H)而不是转置(.T)。我选择不这样做是为了避免混淆符号(H*H.H)。