Как создать InnerIterator для разреженного блока в Eigen 3.3.4? - PullRequest
0 голосов
/ 18 мая 2018

У меня есть кусок кода, который отлично работает в 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 больше не определяется для блоков или, по крайней мере, разреженных блоков.

Я понимаю, что теперь вам нужно использовать evaluator чтобы определить это.Кто-нибудь знает, каким будет новый синтаксис?

1 Ответ

0 голосов
/ 22 мая 2018

Вам нужно написать:

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);
    /* ... */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...