block - 如何在 Eigen 3.3.4 中的稀疏块上实例化 InnerIterator?
问题描述
我有一段代码在 Eigen 3.2 中运行良好,但在 Eigen 3.3.4 中不再有效。这是代码:
// Temporary Eigen blocks
Eigen::Block<const Eigen::SparseMatrix<double> >
tmpAPotentialBlock(A.block(startPotential, startPotential, sizePotential,sizePotential)),
tmpAFlowBlock(A.block(startFlow, startPotential, sizeFlow, sizePotential));
for (Eigen::SparseMatrix<double>::Index k=0; k<sizePotential; ++k) {
// Iterator to the first term of the column k of the potential block and the flow block.
Eigen::Block<const Eigen::SparseMatrix<double> >::InnerIterator itAPotential(tmpAPotentialBlock,k),
itAFlow(tmpAFlowBlock,k);
...
}
基本上问题是InnerIterator
不再为块或至少稀疏块定义。
我知道您现在需要使用 anevaluator
来定义它。有谁知道新语法是什么?
解决方案
你需要写:
Eigen::InnerIterator<SpBlock> it(tmp,k)
这是一个独立的 C++11示例:
using SpMat = Eigen::SparseMatrix<double>;
using SpBlock = Eigen::Block<const SpMat>;
SpMat A;
Index i, s;
SpBlock tmp(A, i, i, s, s);
for (Eigen::Index k=0; k<s; ++k) {
Eigen::InnerIterator<SpBlock> it(tmp,k);
/* ... */
}
在 C++17 中可以变得更漂亮:
Eigen::SparseMatrix<double> A;
Index i, s;
auto tmp = A.block(i, i, s, s);
for (Eigen::Index k=0; k<s; ++k) {
Eigen::InnerIterator it(tmp,k);
/* ... */
}
推荐阅读
- computer-vision - 是否可以根据边缘长度找到相机相对于立方体(已知尺寸)的 3d 位置?
- authentication - 在 ASP.NET Identity Core 2.2 中设置两个因素令牌的寿命
- wordpress - 如何覆盖表引导程序?
- reactjs - 使用反向代理时的 URL 操作
- python - 没有它,如何让 mpld3 显示与 matplotlib 相同的图形?
- python - gspread update_cells writes to wrong place
- html - 如何将所有设备的 hr 行保持在同一行?
- javascript - 为什么异步函数中的连续 setState 调用没有批处理?
- java - JavaFX 12 中缺少包 javafx.embed.swing?
- android - 来自 Activity 的应用小部件对话框未在 Redmi 手机中显示