【发布时间】:2013-10-11 23:16:53
【问题描述】:
我正在处理一个大型(复杂的)厄米特矩阵,我正在尝试使用 Python/Scipy 对其进行有效对角化。
使用scipy.linalg中的eigh函数,大约需要3秒来生成和对角化大约800x800的矩阵并计算所有特征值和特征向量。
我的问题中的特征值对称分布在 0 附近,范围大致为 -4 到 4。不过,我只需要与负特征值相对应的特征向量,这会将我要计算的范围转换为 [-4,0 )。
我的矩阵是稀疏的,所以很自然地使用scipy.sparsepackage 及其函数通过eigsh 计算特征向量,因为它使用更少的内存来存储矩阵。
我还可以告诉程序只通过which='SA' 计算负特征值。这种方法的问题是,现在大约需要 40 秒来计算一半的特征值/特征向量。我知道,ARPACK 算法在计算小特征值时效率非常低,但我想不出任何其他方法来计算我需要的所有特征向量。
有什么办法可以加快计算速度?也许使用移位反转模式?我将不得不做很多很多对角化并最终增加矩阵的大小,所以我现在有点迷茫。
非常感谢任何帮助!
【问题讨论】:
标签: python scipy sparse-matrix