NumPy:linalg.eig() 和 linalg.eigh() 之间的区别



在Python 3应用程序中,我使用NumPy来计算对称实矩阵的特征值和特征向量。

这是我的演示代码:

import numpy as np
a = np.random.rand(3,3)  # generate a random array shaped (3,3)
a = (a + a.T)/2  # a becomes a random simmetric matrix    
evalues1, evectors1 = np.linalg.eig(a)
evalues2, evectors2 = np.linalg.eigh(a)

除了符号之外,我使用np.linalg.eignp.linalg.eigh得到了相同的特征向量和特征值。那么,这两种方法有什么区别呢?

谢谢


编辑:我已经阅读了这里的文档 https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html 在这里 https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigh.html 但我仍然不明白为什么当我有一个对称数组时我应该使用eigh()

eigh保证特征值已排序,并使用更快的算法来利用矩阵对称的事实。如果您知道矩阵是对称的,请使用此函数。
注意eigh不会检查你的矩阵是否确实对称,默认情况下它只采用矩阵的下三角形部分,并假设上三角形部分由矩阵的对称性定义。

eig适用于一般矩阵,因此使用较慢的算法,例如您可以使用 IPythons 魔术命令%timeit进行检查。如果使用较大的矩阵进行测试,您还将看到通常特征值不会在此处排序。

最新更新