NumPy linalg.eigh 返回不正确的特征向量
NumPy linalg.eigh is returning incorrect eigenvectors
我正在使用 NumPy 的线性代数包来计算与大型 Hermitian 矩阵的最小特征值对应的特征向量。 linalg.eigh
函数要求 return 厄尔米特矩阵的特征值按升序排列,以及相应的特征向量。这正是我所需要的。但是,即使在已经对角矩阵的简单情况下,此功能似乎也失败了。例如:
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 的特征向量,这显然是不正确的。谁能告诉我为什么这个功能失败了?
请参阅 NumPy 文档:https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.linalg.eigh.html .
特征向量作为输出数组的列返回,而不是行。你会看到 v[:,0] 是对应于 -0.6 的特征向量。如果转置结果,您可以将特征向量转换为行格式。
我正在使用 NumPy 的线性代数包来计算与大型 Hermitian 矩阵的最小特征值对应的特征向量。 linalg.eigh
函数要求 return 厄尔米特矩阵的特征值按升序排列,以及相应的特征向量。这正是我所需要的。但是,即使在已经对角矩阵的简单情况下,此功能似乎也失败了。例如:
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 的特征向量,这显然是不正确的。谁能告诉我为什么这个功能失败了?
请参阅 NumPy 文档:https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.linalg.eigh.html .
特征向量作为输出数组的列返回,而不是行。你会看到 v[:,0] 是对应于 -0.6 的特征向量。如果转置结果,您可以将特征向量转换为行格式。