Eigen 3.3.4中如何在稀疏块上实例化InnerIterator?
解决Eigen 3.3.4中稀疏矩阵Block的InnerIterator兼容问题
嘿,我之前也遇到过Eigen版本升级后稀疏块迭代器失效的情况,刚好能给你捋清楚新的写法!
Eigen 3.3之后对稀疏表达式的迭代接口做了调整,Block<const SparseMatrix<double>>不再直接提供InnerIterator,而是需要通过**Eigen::SparseEvaluator**这个统一评估器来访问内部元素。以下是适配3.3.4的完整代码:
// Temporary Eigen blocks Eigen::Block<const Eigen::SparseMatrix<double> > tmpAPotentialBlock(A.block(startPotential, startPotential, sizePotential,sizePotential)); Eigen::Block<const Eigen::SparseMatrix<double> > tmpAFlowBlock(A.block(startFlow, startPotential, sizeFlow, sizePotential)); // 关键变化:为每个Block创建SparseEvaluator实例 Eigen::SparseEvaluator<decltype(tmpAPotentialBlock)> evalAPotential(tmpAPotentialBlock); Eigen::SparseEvaluator<decltype(tmpAFlowBlock)> evalAFlow(tmpAFlowBlock); for (Eigen::SparseMatrix<double>::Index k=0; k<sizePotential; ++k) { // 使用Evaluator的InnerIterator替代原Block的InnerIterator typename decltype(evalAPotential)::InnerIterator itAPotential(evalAPotential, k); typename decltype(evalAFlow)::InnerIterator itAFlow(evalAFlow, k); // 下面的迭代逻辑可以完全保留原来的写法,比如: // while (itAPotential) { ...; ++itAPotential; } // while (itAFlow) { ...; ++itAFlow; } }
几点说明:
SparseEvaluator是Eigen 3.3+为稀疏表达式(包括Block、Submatrix等)提供的统一访问接口,用来替代旧版本中直接在表达式类上定义迭代器的方式。- 用
decltype可以自动推导Block的类型,避免手动写冗长的模板参数,代码更简洁。 - 迭代器的使用逻辑和旧版本完全一致,你原来写的遍历、取值(
itAPotential.value())、取行号(itAPotential.row())等代码都不需要修改。
内容的提问来源于stack exchange,提问作者barry845
相关产品推荐
相关产品推荐

