2

我正在使用一个大型(复杂的)厄米特矩阵,我正在尝试使用 Python/Scipy 有效地对其进行对角化。

使用其中的eigh函数scipy.linalg大约需要 3 秒来生成和对角化大约 800x800 的矩阵并计算所有特征值和特征向量。

我的问题中的特征值对称分布在 0 附近,范围大致为 -4 到 4。不过,我只需要与负特征值相对应的特征向量,这会将我要计算的范围转换为 [-4,0)。

我的矩阵是稀疏的,因此使用scipy.sparse包及其函数来计算特征向量是很自然的eigsh,因为它使用更少的内存来存储矩阵。

我也可以告诉程序只计算负特征值which='SA'。这种方法的问题是,现在大约需要 40 秒来计算一半的特征值/特征向量。我知道,ARPACK 算法在计算小特征值时效率非常低,但我想不出任何其他方法来计算我需要的所有特征向量。

有什么办法可以加快计算速度?也许使用移位反转模式?我将不得不做很多很多对角化并最终增加矩阵的大小,所以我现在有点迷茫。

我真的很感激任何帮助!

4

1 回答 1

1

这个问题最好在http://scicomp.stackexchange.com上问,因为它更多的是一般的数学问题,而不是特定于 Scipy 或与编程相关的问题。

如果您需要所有特征向量,则使用 ARPACK 没有多大意义。由于您需要 N/2 个特征向量,因此您的内存要求至少是N*N/2浮点数;并且可能在实践中更多。使用eigh需要N*N+3*N浮动。eigh然后是最低要求的 2 倍,所以最简单的解决方案是坚持下去。

如果您可以“在线”处理特征向量,以便您可以在处理下一个之前丢弃前一个,那么还有其他方法;查看 scicomp 上类似问题的答案。

于 2013-10-08T13:31:08.520 回答