8

我想知道是否有一个 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 . 有人对这个有了解吗?请帮忙!先感谢您!

4

3 回答 3

6

使用这个: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

Find k eigenvalues and eigenvectors of the square matrix A.
于 2014-03-19T13:21:27.623 回答
2

根据文档:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html

而且根据我自己的经验, numpy.linalg.eig(A) 不会以任何特定的顺序对特征向量进行排序,这就是 OP 和后续的假设。我建议类似:

rearrangedEvalsVecs = sorted(zip(evals,evecs.T),\
                                    key=lambda x: x[0].real, reverse=True)
于 2013-05-15T16:01:42.187 回答
1

似乎没有一个 numpy 等效于 Matlab 的eigs(A,B,k)用于查找k个最大特征向量的方法。

如果您有兴趣,Enthought 已经编制了一个表格,显示了 Matlab 和 numpy 之间的差异。这应该有助于回答这样的问题: http ://www.scipy.org/NumPy_for_Matlab_Users

另一种想法是,对于 2x2 矩阵,我认为eigs(A,B,1)无论如何也无济于事。计算第一个特征对所涉及的工作使矩阵转换到第二个直接出现的位置。只有 3x3 和更大的尺寸才有好处。

于 2011-10-20T17:08:02.123 回答