如何求解稀疏矩阵的线性方程AX = b

时间:2017-12-08 15:33:52

标签: c++ eigen

我有稀疏矩阵A(120,000 * 120,000)和矢量b(120,000),我想用Eigen库求解线性系统AX = b。我试着按照文档但我总是有错误。我也尝试将矩阵更改为密集并解决系统

    Eigen::MatrixXd H(N,N);
    HH =Eigen:: MatrixXd(A);
    Eigen::ColPivHouseholderQR<Eigen::MatrixXd> dec(H);
    Eigen::VectorXd RR = dec.solve(b);  

但是我遇到了内存错误。 请帮我找到解决这个问题的方法。

1 个答案:

答案 0 :(得分:2)

对于稀疏系统,我们通常使用迭代方法。一个原因是直接求解器如LU,QR ...因子分解填充了你的初始矩阵(填写的意思是最初零组件被非零组件替换)。在大多数情况下,生成的密集矩阵不再适合内存( - > 您的内存错误)。简而言之,迭代求解器不会改变稀疏模式,因为它们只涉及矩阵向量积(无填充)。

那就是说,你必须首先知道你的系统是否是对称肯定(又名SPD),在这种情况下你可以使用conjugate gradient method。否则,您必须使用非BiCGSTABGMRES等非对称系统的方法。

您必须知道我们大部分时间都使用preconditioner,特别是如果您的系统处于病态状态。

看着我发现的Eigen doc(没有预处理器afaik的例子):

  int n = 10000;
  VectorXd x(n), b(n);
  SparseMatrix<double> A(n,n);
  /* ... fill A and b ... */ 
  BiCGSTAB<SparseMatrix<double> > solver;
  solver.compute(A);
  x = solver.solve(b);
  std::cout << "#iterations:     " << solver.iterations() << std::endl;
  std::cout << "estimated error: " << solver.error()      << std::endl;

这可能是一个好的开始(如果你的矩阵是SPD,使用共轭梯度法)。请注意,这里没有预处理器,因此收敛肯定会很慢。

回顾:大矩阵 - &gt;迭代方法+预处理器。

这真的是第一个&#34;基本/天真&#34;解释,您可以在Saad's book: Iterative Methods for Sparse Linear Systems中找到有关该理论的更多信息。同样,这个主题很大,你可以找到很多关于这个主题的书。

我不是Eigen用户,但有precondtioners here。 - &GT;不完全LU(不对称系统)或不完全Cholesky(SPD系统)通常是很好的通用预处理器,有第一次测试。

相关问题