5

到目前为止,我使用 numpy.linalg.eigvals 来计算具有至少 1000 行/列的二次矩阵的特征值,并且在大多数情况下,大约五分之一的条目非零(我不知道这是否应该被视为稀疏矩阵)。我发现另一个主题表明 scipy 可能会做得更好。

但是,由于我必须计算数十万个大小不断增加的大型矩阵的特征值(可能多达 20000 行/列,是的,我需要它们的所有特征值),这总是需要很长时间。如果我能加快速度,即使只是最微小的一点,这很可能是值得的。

所以我的问题是:在不将自己限制在 python 的情况下,是否有更快的方法来计算特征值?

4

2 回答 2

5

@HighPerformanceMark 在评论中是正确的,因为 numpy 背后的算法(LAPACK 等)是一些最好的,但可能不是最先进的数字算法,用于对角化完整矩阵。但是,如果您有以下情况,您可以大大加快速度:

稀疏矩阵

如果您的矩阵是稀疏的,即填充条目的数量是 k,k<<N**2那么您应该查看scipy.sparse.

带状矩阵

有许多算法可用于处理特定带状结构的矩阵。查看 中的求解器scipy.linalg.solve.banded

最大特征值

大多数时候,您并不需要所有的特征值。事实上,大部分物理信息来自最大的特征值,其余的只是短暂的高频振荡。在这种情况下,您应该研究快速收敛到那些最大特征值/向量的特征值解决方案,例如Lanczos 算法

于 2013-07-25T14:33:58.313 回答
1

在不更改代码的情况下(尤其是在多核机器上)获得不错的加速的一种简单方法是将 numpy 链接到更快的线性代数库,如 MKL、ACML 或 OpenBLAS。如果您与学术机构相关联,优秀的Anaconda python 发行版将让您轻松免费链接到 MKL;否则,您可以支付 30 美元(在这种情况下,您应该先尝试 30 天的优化试用)或自己动手(有点烦人的过程,但绝对可行)。

不过,我肯定也会尝试使用稀疏特征值求解器。

于 2013-07-25T14:39:58.370 回答