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

这是我的演示代码:

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获得了相同的特征 vector 和特征值。那么,这两种方法有什么区别?

谢谢

编辑:我已经在这里阅读文档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适用于一般矩阵,因此使用较慢的算法,例如,可以使用IPython的魔术命令%timeit进行检查。如果使用更大的矩阵进行测试,您还将看到一般而言,特征值不在此处排序。

关于python-3.x - NumPy:linalg.eig()和linalg.eigh()之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45434989/

10-11 09:05