Eigen稀疏矩阵数组声明方法及SimplicialLLT对象声明正确性咨询
声明正确性结论
你给出的两个声明语法层面均合法,可正常编译运行,但使用时有几个需要注意的关键点:
1. Kmat 声明说明
你写的
vector<SparseMatrix<double>> Kmat(NROW, SparseMatrix<double> (NODES,NODES));
是正确的,这行代码会初始化一个长度为20的vector,每个元素都是尺寸为20000×20000的空稀疏矩阵。后续填充非零元素时建议优先用Triplet批量插入的方式,效率远高于逐个插入元素。
2. Kmat_LLT 声明说明
你写的
static vector<SimplicialLLT<SparseMatrix<double>>> Kmat_LLT(Kmat.size());
语法上没有问题,这行代码会初始化一个长度和Kmat一致的vector,每个元素都是默认构造的SimplicialLLT实例。使用时要注意以下几点:
- 不要误以为这个声明完成后就已经得到了逆矩阵:SimplicialLLT实例默认是空的,你需要后续逐个调用
Kmat_LLT[i].compute(Kmat[i])执行乔列斯基分解后,才能用来求解线性方程。 - 稀疏矩阵场景下不建议显式计算逆矩阵:SimplicialLLT存储的是分解后的三角因子,直接用
x = Kmat_LLT[i].solve(b)求解Ax=b的效率远高于先算逆再乘向量,而且20000阶矩阵的逆是稠密矩阵,单张逆矩阵就需要占用约3.2G内存,20张会占用超过60G内存,完全没有必要。 static修饰符需要注意作用域问题:如果该声明在函数内部,Kmat_LLT只会在函数第一次调用时初始化一次,后续函数调用不会重新生成实例,如果你每次调用函数都会更新Kmat的内容,需要手动重新调用compute方法更新分解结果,否则会用到旧的计算结果。- SimplicialLLT仅支持对称正定矩阵的分解,你要确保你的Kmat每个子矩阵都满足对称正定的条件,否则会分解失败。可以调用
Kmat_LLT[i].info()判断分解是否成功,返回值为Eigen::Success则代表分解正常。
内容的提问来源于stack exchange,提问作者pk68
相关产品推荐
相关产品推荐

