【问题标题】:What is a fast simple solver for a large Laplacian matrix?什么是大型拉普拉斯矩阵的快速简单求解器?
【发布时间】:2013-06-28 09:37:37
【问题描述】:

我需要求解电阻网络研究中出现的一些大型 (N~1e6) 拉普拉斯矩阵。其余的网络分析正在使用 boost 图进行处理,如果可能的话,我想留在 C++ 中。我知道有很多很多 C++ 矩阵库,但似乎没有人在速度或可用性方面是明确的领导者。此外,关于这个主题的许多问题,在这里和其他地方似乎很快就变成了实用性有限的洗衣清单。为了帮助自己和他人,我会尽量保持问题的简洁性和可回答性:

可以有效处理以下要求的最佳库是什么?

  • 矩阵类型:对称对角显性/拉普拉斯矩阵
  • 大小:非常大 (N~1e6),无需动态调整大小
  • 稀疏性:极端(每行/列最多 5 个非零项)
  • 需要的操作:求解 A*x=b 中的 x 和 mat/vec 相乘
  • 语言:C++(没问题)
  • 优先级:代码的速度和简单性。我真的宁愿避免为这个问题学习一个全新的框架,或者不得不手动编写太多的帮助代码。

非常喜欢用一个最小的工作示例来回答......

【问题讨论】:

标签: c++ linear-algebra sparse-matrix numerical-methods


【解决方案1】:

有很多相关的帖子,你可以看看。 我会推荐 UMFPACK and BOOST's uBLAS Sparse Matrix 中使用的 C++ 和 Boost::ublas

【讨论】:

    【解决方案2】:

    Eigen 非常好用,是我所知道的最快的库之一:

    http://eigen.tuxfamily.org/dox/group__TutorialSparse.html

    【讨论】:

      【解决方案3】:

      如果您想编写自己的求解器,就简单性而言,很难击败Gauss-Seidel 迭代。更新步骤是一行,并且可以很容易地并行化。 Successive over-relaxation (SOR) 只是稍微复杂一些,收敛速度更快。

      Conjugate gradient 也易于编码,并且应该比其他迭代方法收敛得更快。需要注意的重要一点是,您不需要形成完整的矩阵 A,只需计算矩阵向量乘积 A*b。一旦它起作用了,您可以通过添加像 SSOR (Symmetric SOR) 这样的预处理器来再次提高收敛率。

      可能最适合自己编写的最快求解方法是基于傅立叶的求解器。它本质上涉及取右侧的 FFT,将每个值乘以其坐标的函数,然后取逆 FFT。您可以使用 FFTW 之类的 FFT 库,也可以使用自己的库。

      Arieh Iserles 的 A First Course in the Numerical Analysis of Differential Equations 是所有这些的一个很好的参考。

      【讨论】:

        猜你喜欢
        • 2019-09-03
        • 1970-01-01
        • 2013-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-25
        相关资源
        最近更新 更多