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

dec*_*nza 10 numpy python-3.x

在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)
Run Code Online (Sandbox Code Playgroud)

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

谢谢


编辑:我在这里阅读了文档https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.htmlhttps://docs.scipy.org/doc/numpy/ reference/generated/numpy.linalg.eigh.html 但是eigh()当我有一个对称数组时,我仍然无法理解为什么我应该使用它.

Mic*_* H. 19

eigh保证您对特征值进行排序,并使用更快的算法,利用矩阵对称的事实.如果您知道矩阵是对称的,请使用此功能.
注意,eigh不检查矩阵是否确实是对称的,它默认只取矩阵的下三角部分,并假设上三角部分由矩阵的对称性定义.

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

  • 很好的答案! (2认同)