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