我正在使用NumPy的线性代数包来计算对应于大Hermitian矩阵的最小特征值的特征向量。 linalg.eigh
函数声称以升序返回Hermitian矩阵的特征值,以及相应的特征向量。这正是我所需要的。然而,即使在已经对角矩阵的简单情况下,似乎该功能也失败了。例如:
import numpy as np
H = np.diag([-0.4,-0.5, 0.4, 2.3, -0.5, -0.6, 0.3, 2.2, 0.4, 0.3, 1.2, 3.1, 2.3, 2.2, 3.1, 5.])
np.linalg.eigh(H)
输出
(array([-0.6, -0.5, -0.5, -0.4, 0.3, 0.3, 0.4, 0.4, 1.2, 2.2, 2.2, 2.3, 2.3, 3.1, 3.1, 5. ]),
array([[ 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
[ 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]]))
即。函数输出[0,0,0,1,...]作为对应于-0.6的特征向量,这显然是不真实的。谁能告诉我为什么这个功能失败了?
答案 0 :(得分:3)
请参阅NumPy文档:https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.linalg.eigh.html。
特征向量作为输出数组的列而不是行返回。你会看到v [:,0]是对应于-0.6的特征向量。如果转置结果,则可以将特征向量转换为行格式。