我想知道是否有一个Python包,numpy或者其他,它有一个计算小矩阵的第一个特征值和特征向量的函数,比如2x2。我可以在纽比使用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。有人知道这件事吗?请帮忙!提前谢谢你!
根据文件:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html
而且根据我自己的经验,numpy.linalg.eig(A)并没有按照任何特定的顺序对特征向量进行排序,这是OP和后续的假设。我建议如下:
在寻找最大特征向量时,似乎没有一个与Matlab的
eigs(A,B,k)
等价的数值。如果您感兴趣,enthough已经编译了一个表,显示了Matlab和numpy之间的差异。这应该有助于回答像这样的问题:http://www.scipy.org/NumPy_for_Matlab_Users
另一个想法是,对于2x2矩阵,我认为
eigs(A,B,1)
无论如何都没有帮助。计算第一个特征对所需的工作,将矩阵变换到第二个特征对直接出现的地方。只有3x3和更大的才有好处。使用这个: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
相关问题 更多 >
编程相关推荐