In practice, this simple algorithm does not work very well for
computing very many of the eigenvectors because any round-off error
will tend to introduce slight components of the more significant
eigenvectors back into the computation, degrading the accuracy of the
computation. (2)
以下是您问题中非常规特定部分的答案:
原则上,NumPy和SciPy
linalg()
例程应该相同。两者都在内部使用LAPACK和BLAS例程。“scipy.sparse”中的实现使用了一种特定的算法,该算法对稀疏矩阵(即大多数为零项的矩阵)非常有效。如果矩阵是稠密的,不要使用这个。注意,从技术上讲,SciPy/NumPy中的
eig()
是不同的实现,因为这两个包都可以用Lapack/BLAS的不同实现来构建。这里常见的选择是netlib、ATLAS、Intel MKL或OpenBLAS提供的标准Lapack/BLAS。第三个的特殊行为与Lanczos algorithm有关,它在稀疏矩阵中非常有效。
scipy.sparse.linalg.eig
的文档说,它使用ARPACK的包装器,ARPACK反过来使用“隐式重新启动的Arnoldi方法(IRAM),或者在对称矩阵的情况下,使用Lanczos算法的相应变体。”(1)。现在,Lanczos算法有一个特性,它可以更好地处理大特征值(实际上,它使用最大特征值):
所以,虽然Lanczos算法只是一个近似值,但我猜其他两种方法使用算法来找到精确的特征值——而且看起来它们都是,这可能也取决于使用的算法。
相关问题 更多 >
编程相关推荐