【问题标题】:C++ How do I solve very large system of sparse linear systemC ++如何解决非常大的稀疏线性系统系统
【发布时间】:2017-03-26 09:25:36
【问题描述】:

我正在尝试用 C++ 求解一个非常大且稀疏的线性方程组。目前,我正在使用来自 eigen 的 BiCGSTAB。它适用于小矩阵,但对于我需要的大小为 40804x40804 的矩阵(未来可能更大)花费了太多时间。

我有一个很长的脚本,但我只是使用了以下格式:

SparseMatrix<double> sj(40804,40804);
VectorXd c_(40804), sf(40804);
sj.reserve(VectorXi::Constant(40804,36)); //This is a very good estimate of how many non zeros in each column
//...Fill in actual number in sj
sj.makeCompressed();
BiCGSTAB<SparseMatrix<double> > handler;
//...Fill in sj, only in the entries that have been initialized previously
handler.analyzePattern(sj)
handler.factorize(sj);
c_.setZero();
c_=handler.solve(sf);

这需要的时间太长了!是的,解决方案确实存在。 matlab 中的稀疏函数似乎可以很好地处理这个问题,但我需要在 C++ 中使用它才能连接到服务器。

如果你能帮助我,我将不胜感激!

【问题讨论】:

  • 如果 matlab 为您做得好,为什么不在 c++ 中使用它。 Link
  • 如果连接到服务器至关重要,也许你应该尝试使用 pari/gp...
  • 确保在编译器优化开启的情况下进行编译,然后您也可以尝试使用像Eigen::SparseLU 这样的直接求解器(只需将BiCGSTAB 替换为SparseLU)或使用IncompleteLUT BICGSTAB 中的预处理器。

标签: c++ sparse-matrix linear-algebra eigen large-data


【解决方案1】:

您应该考虑使用高级稀疏直接求解器之一:CHOLMOD

稀疏直接求解器是计算分析中的基本工具,它提供了一种非常通用的方法,可以为几乎任何问题获得高质量的结果。 CHOLMOD 是稀疏Cholesky factorization 的高性能库。

我保证这个包肯定会帮助你。此外,CHOLMOD 从 2012 年开始支持 GPU 加速,版本为 4.0.0 。在 SuiteSparse-4.3.1 中,性能得到了进一步的改进,与 CPU 相比,稀疏分解操作的速度提高了 3 倍或更高。

如果您的矩阵是图形的表示,您还可以考虑METISCHOLMOD 的组合。这意味着您将能够在图中进行分区/域分解,然后使用CHOLMOD 并行求解。

SuiteSparse 是一个强大的工具,支持线性(KLU)和直接求解器。

这里是GitHub linkUserGuideSuiteSparse's home page

【讨论】:

    猜你喜欢
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 2017-06-26
    相关资源
    最近更新 更多