c++ - Eigen 线性代数求解器似乎很慢

标签 c++ matlab linear-algebra eigen

我想使用 Eigen 求解器求解线性代数方程 Ax = b。 在我的例子中,A 是一个复杂的稀疏矩阵 (26410*26410),b 是一个实 vector (26410*1)。

我在 MATLAB 中使用 mex 文件将稀疏矩阵 A 和 vector b 映射到 Eigen 可接受的格式。我使用 Eigen 求解器的原因是希望它比直接在 MATLAB 中使用 x = A\b 求解更快。

然而,在尝试了LDLT、​​SparseLU、CG和BiCGSTAB之后,我发现结果并不是很令人满意:

LDLT 需要 1.462 秒,norm(A*x - b)/norm(b) = 331; SparseLU用1.5193e-4耗时37.994s; BiCGSTAB 以 4.5977e-4 耗时 95.217s; 相比之下,在MATLAB中直接使用x = A\b耗时13.992s,误差范数为2.606e-5。

我知道将 MATLAB workspace 中的稀疏矩阵 A 和 vector b 映射到 Eigen 有点愚蠢,也很耗时。但是我想知道我得到的结果是否是 Eigen 能给出的最好结果?任何人都可以给我一些指示吗?我应该尝试其他一些线性方程求解器吗?非常感谢!以下是主要部分代码。

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {

    //input vars

    //temp var
    size_t nrows;

    //output vars
    //double *x;

    //GetData
    /* check inputs 
    ...*/

    //"mxArray2SCM" is a sub-function for map the complex sparse matrix in Eigen
    SpCMat A = mxArray2SCM(prhs[0]);
    //SpMat A = mxArray2SM(prhs[0]);

    //"mxArray2ECV" is a sub-function for map the real vector in Eigen
    Eigen::VectorXcd b = mxArray2ECV(prhs[1]);
    //Eigen::VectorXd b = mxArray2EV(prhs[1]);   
    nrows = b.size();
    //Computation
    Eigen::VectorXcd x(nrows);
    //SparseLU<SparseMatrix<CD> > solver;
    BiCGSTAB<SparseMatrix<CD>,IncompleteLUT<CD> > BiCG;
    //BiCG.preconditioner().setDroptol(0.001);
    BiCG.compute(A);
    if(BiCG.info()!=Success){
        //decomposition failed
        return;
    }
    x = BiCG.solve(b);

    //Output results
    plhs[0] = ECV2mxArray(x);   
}

最佳答案

您是否考虑过使用 PetSc对于 Krylov 求解器或 SLEPc计算特征值?

确保在使用特定的 Krylov 求解器之前分析特征谱(CG 仅适用于对称正定矩阵)。

PETSc 有很多求解器,您可以根据您的特征谱尝试这些求解器。

可以查看Y. Saad's有关这些求解器如何工作的书籍。

如果您的矩阵不是对称正定 GMRES 是一个不错的选择。

关于c++ - Eigen 线性代数求解器似乎很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39994656/

相关文章:

multithreading - 在 Octave 中使用线程运行代码

algorithm - 快速恢复领先奇异向量的方法

c++ - 使用 pthread_create 从线程调用类成员函数

C++ 未声明的类错误

c++ - 显式链接 DLL 和程序挂起

matlab - 如何在Matlab中对文件夹及其子文件夹中的元素进行分类以进行匹配

python - 来自使用 Python 的 MATLAB .fig 文件的数据?

matlab - matlab中的 block 共轭梯度

python - 为 Tensorflow 中两个张量中的每对元素应用函数

c++ - 运行时检查失败 #2 - 变量 'arr' 周围的堆栈已损坏。我试图找到它,但仍然找不到我出界数组的位置