特征线性代数求解器似乎很慢

时间:2016-10-12 09:05:50

标签: c++ matlab linear-algebra eigen

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

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

然而,在尝试过LDLT,SparseLU,CG和BiCGSTAB之后,我发现结果不太令人满意:

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

我知道将MATLAB工作空间中的稀疏矩阵A和向量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);   
}

1 个答案:

答案 0 :(得分:0)

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

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

PETSc有很多解决方案,你可以根据你的特征谱来试试。

您可以查看这些解算器如何工作的Y. Saad's书。

如果矩阵不对称,则肯定GMRES是一个不错的选择。