我想通过使用 C++ 中的 Eigen 库求解 Ax=b 方程,其中 A 是稀疏矩阵 (1,964,568 x 1,964,568 nnz=75256446),b 也是稀疏矩阵 (1,964,568 x 1,964,568 nnz= 25354926)。
起初我尝试使用 Eigen Sparse LU 来解决我的问题,几个小时后我就耗尽了内存(我有 128GB RAM)。此后,我将 INTEL MKL 库与 Pardiso 求解器一起包含在内。即使这样我也无法解决我的问题。也许有人有一些建议来解决我的问题?
#define EIGEN_USE_MKL_ALL
#include <Eigen/Sparse>
#include <unsupported/Eigen/SparseExtra>
#include <iostream>
#include <Eigen/OrderingMethods>
#include <Eigen/PardisoSupport>
typedef Eigen::SparseMatrix<double>SpMat;
typedef Eigen::COLAMDOrdering<int>Order;
int main()
{
SpMat A;
SpMat B;
SpMat X;
Eigen::loadMarket(A, "MatK.mtx");
Eigen::loadMarket(B, "MatM.txt");
A.makeCompressed();
B.makeCompressed();
Eigen::PardisoLU<SpMat>solver;
solver.analyzePattern(A);
solver.factorize(A);
X = solver.solve(B);
}
我可以编译我的代码并运行它。我只需要更好的性能和更少的内存。
最佳答案
因为我还没有找到任何方法来解决这个问题。我尝试更改我的 RHS 矩阵,因为大量的列是一个大问题。 我在算法中看到我的 RHS 与另一个矩阵相乘,这将列数减少到 10。 这样就可以使用 Intel Pardiso LDLT 求解器而不是 LU 进行求解。 迭代求解器迭代次数过多才收敛。
关于c++ - 使用 eigen/Intel MKL 求解稀疏线性系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57705452/