逆带宽减少的稀疏矩阵:更快或更慢

Inverse a sparse matrix with reduced bandwidth: faster or not

我有一个大小为 1393 x 1393 的邻接矩阵,它看起来像:

我正在根据这个矩阵做空间建模,后面会涉及到密集的矩阵求逆。听说对于这样的稀疏矩阵,我们可以将行和列重新排序以达到最小带宽,这将大大减少矩阵求逆所需的时间。我找到的算法叫做 Gibbs-Poole-Stockmeyer,我找到了一个 FORTRAN implementation

我是 R 用户,目前正致力于在 R 中调用这个旧的 FORTRAN 代码,但没有成功(仍在尝试)。所以我的问题是:

  1. 当使用R/Rcpparmadillo时,如果减少带宽,稀疏矩阵的矩阵求逆会更容易吗?我是否需要任何明确的命令来告诉 R 如何求逆矩阵或者它只是自然发生的。

  2. 谁能帮我在 R 中使用 FORTRAN 代码?我仍在尝试并将错误上传到我这边。

谢谢!

编辑: 我找到了另一种算法:Cuthill–McKee 算法,目的相同。这个问题属于图论领域。 在 R 包的帮助下:RBGL,我设法通过重命名图中的顶点来重新排序原始矩阵的行和列,并具有新结构: 但是,当我测试矩阵求逆的计算时间时,没有区别:Bmat 是旧矩阵,而 new_B 是带宽减少的矩阵。

n = dim(Bmat)[1]
IrhoC = diag(n) - 0.1 * Bmat
IrhoC2 = diag(n) - 0.1 * new_B
library(microbenchmark)
microbenchmark(
  old = chol2inv(chol(IrhoC)),
  new = chol2inv(chol(IrhoC2)),
  solve_old = chol2inv(chol(IrhoC)),
  solve_new = chol2inv(chol(IrhoC2)),
  times = 10
)
Unit: milliseconds
      expr      min       lq      mean   median       uq       max neval cld
       old 59.66203 65.81924 106.55729 82.68835 94.74017 346.38852    10   a
       new 68.26124 76.63195  82.13040 81.81659 87.03293  97.39588    10   a
 solve_old 65.39816 79.67434  82.78533 85.27720 89.92952  94.98980    10   a
 solve_new 60.42481 64.97768  77.97695 77.98818 87.53069  99.21062    10   a

原来那些矩阵求逆是没有时间差的。在这一点上,我不知道需要什么样的 commands/options 才能利用新的减少带宽矩阵。

希望这仍然有用。

您可能没有发现差异,因为调用的 Cholesky 方法是标准方法,即不是为稀疏(重新排序)矩阵设计的。我发现了一种似乎在 scikit.sparse 库 (Python) 中有效的方法。 但是,您的问题与以下示例非常相似:Rue and Held,2005 , "Gaussian Markov Random Fields (GMRF) / Theory and applications"(第 2.5 节)。他们为 GMRFs 发布了一个名为:GMRFLib 的 R 包,希望它能满足您的需求。