特征线性代数求解器似乎很慢
Eigen linear algebra solvers seem slow
我想用特征解法求解一个线性代数方程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是一个很好的选择。
相关文章:
- 使用工程空间在软件包中导入的线性代数库EIGEN
- 特征库,简单的线性代数操作,具有稀疏的矩阵,增加了其分配的尺寸
- C++ OpenMP 中线性代数函数的高效并行化
- C++ 多个图像上的 OpenCV 线性代数?
- 带有 TooN 和 ROS 的线性代数
- 线性代数的过载操作员
- 线性代数转换矩阵 - 通过乘以矩阵从点到不同点
- 使用犰狳线性代数包存储矩阵需要多少内存
- 如何设计:矩阵的线性代数例程
- 具有复数的任意精度线性代数c/c++库
- 建议为C++选择一个线性代数库
- C++ eigen3 线性代数库,奇数性能结果
- 转换gsl线性代数以用于scalapack或其他并行矩阵库
- 线性代数的CPU指令集
- 结合线性代数库与Boost::Units
- 本征在其线性代数Ax=b中能否使用双精度以上?
- 特征线性代数求解器似乎很慢
- 矩阵/线性代数库的多态包装器-C++,从Eigen开始
- 线性代数-SVD在C/C++中求解harwell-boeing稀疏a.x=b系统
- 线性代数 - 使用犰狳C++的余弦相似性给了我负面的结果