我想知道是否有一个Python包,numpy或其他,有一个函数可以计算一个小矩阵的第一个特征值和特征向量,比如2x2。我可以在numpy中使用linalg包,如下所示。
import numpy as np
def whatever():
A = np.asmatrix(np.rand(2, 2))
evals, evecs = np.linalg.eig(A)
#Assume that the eigenvalues are ordered from large to small and that the
#eigenvectors are ordered accordingly.
return evals[0], evecs[:, 0]
但这需要很长时间,我怀疑这是因为numpy通过某种迭代过程计算特征向量,所以我想知道是否有更快的算法只返回第一个(最大的)特征值和特征向量,因为我只需要第一个。
对于2x2矩阵,我当然可以自己写一个函数,用解析的方法计算特征值和特征向量,但是浮点计算会有问题,例如当我用一个很大的数除以一个很小的数时,我得到无穷大或NaN。有人知道这方面的知识吗?请帮助!提前感谢!
3条答案
按热度按时间cnh2zyt31#
使用此选项:http://docs.scipy.org/doc/scipy/reference/sparse.linalg.html
http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.linalg.eigs.html#scipy.sparse.linalg.eigs
nukf8bse2#
根据文件:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html
根据我自己的经验,numpy.linalg.eig(A)并不以任何特定的顺序对特征向量进行排序,这似乎是OP和后续的假设。
mjqavswn3#
在寻找 k 个最大特征向量时,似乎没有一个与Matlab的
eigs(A,B,k)
相当的函数。如果你感兴趣的话,Enthought整理了一个表格,展示了Matlab和numpy之间的区别,这对回答下面这样的问题应该很有帮助:Link
另一个想法是,对于2x2矩阵,我不认为
eigs(A,B,1)
会有任何帮助。计算第一个特征对所涉及的工作是将矩阵变换到第二个直接出现的地方。只有3x3和更大的矩阵才有好处。