到目前为止,我使用numpy.linalg.eigvals来计算具有至少1000行/列的二次矩阵的特征值,并且在大多数情况下,其大约五分之一的条目非零(我不知道是否应该被认为是一个稀疏矩阵)。我找到了另一个topic,表明scipy可能会做得更好。
然而,由于我必须计算数十万个大小不断增大的大型矩阵的特征值(可能高达20000行/列,是的,我需要所有的特征值),这将总是花费很长时间。如果我能加快速度,即使只是最微小的一点,也很可能值得努力。
所以我的问题是:当不限制自己使用python时,是否有更快的方法来计算特征值?
答案 0 :(得分:4)
@HighPerformanceMark在评论中是正确的,因为numpy(LAPACK等)背后的算法是最好的,但也许不是最先进的,用于对齐整个矩阵的数值算法。但是,如果您有以下情况,基本可以加快速度:
如果您的矩阵是稀疏的,即填充条目的数量是k,那么k<<N**2
就是{{1}},那么您应该看scipy.sparse
。
有许多算法可以处理特定banded structure的矩阵。
查看scipy.linalg.solve.banded
中的解算器。
大多数情况下,您并非真正需要所有特征值。事实上,大多数物理信息来自最大的特征值,其余的只是高频振荡,只是瞬态的。在这种情况下,您应该研究快速收敛到那些最大特征值/向量的特征值解,例如Lanczos algorithm。
答案 1 :(得分:1)
在没有代码更改的情况下(特别是在多核机器上)获得体面加速的简单方法是将numpy链接到更快的线性代数库,如MKL,ACML或OpenBLAS。如果您与学术机构有联系,优秀的Anaconda python发行版将让您轻松链接到MKL免费;否则,您可以支付30美元(在这种情况下,您应该首先尝试优化的30天试用版)或do it yourself(这是一个有点烦人的过程,但绝对可行)。
我绝对会尝试使用稀疏特征值求解器。