Eigen稀疏矩阵求逆耗时异常问题及优化方案咨询
问题分析与优化方案
首先明确核心问题:你尝试显式存储500,000×500,000稀疏矩阵的逆矩阵,但绝大多数稀疏矩阵的逆矩阵是稠密的。这意味着所谓的"稀疏逆矩阵"实际上需要存储几乎全部2.5e11个元素——哪怕用稀疏矩阵格式存储,也需要处理海量非零元素,这就是赋值操作耗时超3小时的根本原因。
而你第一个代码中solver.solve(I)不赋值时耗时仅2秒,是因为Eigen并没有真正完成所有求解并生成逆矩阵的完整数据,只是基于已完成的LLT分解做了前置校验,没有实际输出所有结果。
优化方案
避免显式生成逆矩阵(推荐):
如果你后续需要用逆矩阵执行矩阵-向量乘法(比如计算invMat * v),直接调用solver.solve(v)即可。求解器会复用compute阶段完成的LLT分解结果快速完成向量求解,完全不需要生成整个逆矩阵,这才是稀疏求解器的设计初衷。仅计算逆矩阵的特定行/列:
如果你只需要逆矩阵的某几行或几列,不要求解整个单位矩阵I,而是单独构造对应位置为1的单位向量。比如要得到逆矩阵的第k列,构造一个仅第k个元素为1的稀疏向量e_k,调用solver.solve(e_k)就能得到目标列,时间和内存成本会大幅降低。放弃显式存储完整逆矩阵:
500,000×500,000的稠密矩阵需要约2PB内存(每个double占8字节),哪怕是稀疏格式存储逆矩阵,非零元素数量也会远超原矩阵,完全不具备实际存储的可行性。
内容的提问来源于stack exchange,提问作者Cong Pan
相关产品推荐
相关产品推荐

