Есть две проблемы.Во-первых, вы не транспонируете множитель.Во-вторых, вы используете поэлементное умножение вместо матричного умножения.
Вот как вы можете исправить обе проблемы:
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
).