在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.eig
和np.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()
。
答案 0 :(得分:8)
eigh
保证您对特征值进行排序,并使用更快的算法,利用矩阵对称的事实。 如果您知道矩阵是对称的,请使用此功能。
注意,eigh
不会检查您的矩阵是否确实是对称的,它默认只取矩阵的下三角部分并假设上三角部分由对称性定义矩阵。
eig
适用于一般矩阵,因此使用较慢的算法,您可以使用IPythons magic命令%timeit
来检查。如果使用较大的矩阵进行测试,您还会看到一般情况下,特征值不会在这里排序。