c++ - 使用 eigen/Intel MKL 求解稀疏线性系统

标签 c++ sparse-matrix eigen pardiso

我想通过使用 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/

相关文章:

python - 如何从 PyTorch 网络中的稀疏矩阵获取后向梯度?

c++ - 具有特征库的 MatrixFree-Matrix(和 Vector)乘积

eigen - 按行线程安全写入 Eigen::MatrixXd

c# - 如何在数据库中存储稀疏 bool 向量?

C++ 部分特化不适用于不同大小的特征矩阵

c++ - 是否有任何 "penalties"用于在函数内定义结构?

c++ - 着色器输入布局无效

c++ - VS 2010 c++ 路径显示在项目属性中但不在 *.vcxprojf 或 *.sln 文件中?

c++ - 构造函数中的 RAII 和异常

r - 将系数名称转换为R中的公式