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

Eigen linear algebra solvers seem slow

本文关键字:线性代数 特征      更新时间:2023-10-16

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

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

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

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

我知道将MATLAB工作空间中的稀疏矩阵a和向量b映射到特征是有点愚蠢和耗时的。但是我想知道我得到的结果是不是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关于这些解算器如何工作的书。

如果你的矩阵是不对称的正定GMRES是一个很好的选择。