如何求解稀疏矩阵的线性方程 AX=b
How can I solve linear equation AX=b for sparse matrix
我有稀疏矩阵 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);
但是我遇到了内存错误。
请帮我找到解决这个问题的方法。
对于稀疏系统,我们一般采用迭代的方法。一个原因是 LU、QR 等直接求解器...因式分解会填充您的初始矩阵(填充初始零分量被非零分量替换的意义)。在大多数情况下,生成的 密集矩阵 不再适合内存(-> 您的内存错误 )。简而言之,迭代求解器不会改变您的稀疏模式,因为它们只涉及矩阵向量乘积(无填充)。
也就是说,您必须首先知道您的系统是否是 对称正定(又名 SPD),在这种情况下您可以使用 conjugate gradient method. Otherwise you must use methods for unsymmetric systems like BiCGSTAB or GMRES.
您必须知道,大多数时候我们使用 preconditioner,尤其是当您的系统状况不佳时。
查看我发现的 Eigen 文档(没有预处理器 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,请使用共轭梯度法)。请注意,这里没有预处理器,因此收敛速度肯定会很慢。
回顾:大矩阵 -> 迭代法 + 预条件子。
这确实是第一个"basic/naive"解释,您可以在Saad's book: Iterative Methods for Sparse Linear Systems中找到有关该理论的更多信息。同样,这个主题很大,您可以找到很多关于这个主题的其他书籍。
我不是 Eigen 用户,但是有 precondtioners here。
-> Incomplete LU (unsymmetric systems) or Incomplete Cholesky (SPD systems) 一般都是很好的通用预条件子,先来测试一下。
我有稀疏矩阵 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);
但是我遇到了内存错误。 请帮我找到解决这个问题的方法。
对于稀疏系统,我们一般采用迭代的方法。一个原因是 LU、QR 等直接求解器...因式分解会填充您的初始矩阵(填充初始零分量被非零分量替换的意义)。在大多数情况下,生成的 密集矩阵 不再适合内存(-> 您的内存错误 )。简而言之,迭代求解器不会改变您的稀疏模式,因为它们只涉及矩阵向量乘积(无填充)。
也就是说,您必须首先知道您的系统是否是 对称正定(又名 SPD),在这种情况下您可以使用 conjugate gradient method. Otherwise you must use methods for unsymmetric systems like BiCGSTAB or GMRES.
您必须知道,大多数时候我们使用 preconditioner,尤其是当您的系统状况不佳时。
查看我发现的 Eigen 文档(没有预处理器 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,请使用共轭梯度法)。请注意,这里没有预处理器,因此收敛速度肯定会很慢。
回顾:大矩阵 -> 迭代法 + 预条件子。
这确实是第一个"basic/naive"解释,您可以在Saad's book: Iterative Methods for Sparse Linear Systems中找到有关该理论的更多信息。同样,这个主题很大,您可以找到很多关于这个主题的其他书籍。
我不是 Eigen 用户,但是有 precondtioners here。 -> Incomplete LU (unsymmetric systems) or Incomplete Cholesky (SPD systems) 一般都是很好的通用预条件子,先来测试一下。