【问题标题】:Diagonalizing large sparse matrix with Python/Scipy使用 Python/Scipy 对大稀疏矩阵进行对角化
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-03-02
      • 2015-07-28
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 2012-01-10
      • 2019-09-30
      相关资源
      最近更新 更多