Eigen linear algebra solvers seem slow

血红的双手。 提交于 2021-02-18 12:17:26

问题


I want to solve a linear algebraic equation Ax = b using Eigen solvers. In my case, A is a complex sparse matrix(26410*26410), b is a real vector (26410*1).

I use mex file in MATLAB to map the sparse matrix A and vector b to Eigen accepted format. The reason why I use Eigen solver is to hope it would be faster than solving directly in MATLAB using x = A\b.

However, after tried LDLT, SparseLU, CG and BiCGSTAB, I found the results are not very satisfying:

LDLT takes 1.462s with norm(A*x - b)/norm(b) = 331; SparseLU takes 37.994s with 1.5193e-4; BiCGSTAB takes 95.217s with 4.5977e-4; On the contrast, directly use x = A\b in MATLAB consumes 13.992s with norm of the error 2.606e-5.

I know it is a little stupid and also time consuming to map the sparse matrix A and vector b in MATLAB workspace to Eigen. But I am wondering whether the results I got are the best results which Eigen can give? Anyone can give me some pointers? Should I try some other linear equation solvers? Thanks a lot in advance! The following is the main part of codes.

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);   
}

回答1:


Have you considered using PetSc for Krylov solvers or SLEPc to compute eigenvalues?

Make sure you analyze the eigenspectrum before using a specific Krylov solver (CG works only for symmetric positive definite matrices).

PETSc has quite a few solvers that you can try out based on your eigenspectrum.

You can check Y. Saad's book on how these solvers work.

If your matrix is not symmetric positive definite GMRES is a good option.



来源:https://stackoverflow.com/questions/39994656/eigen-linear-algebra-solvers-seem-slow

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!