C++ Eigen:接受任何矩阵的递归函数class

C++ Eigen: recursive functions accepting any matrix class

我想要一个递归函数

template <typename Derived>
void f(Eigen::MatrixBase<Derived>& m)
{
    size_t blockRows = ...
    size_t blockCols = ...
    ....
    f(m.block(0, 0, blockRows, blockCols));
}

不幸的是,这会导致无限的编译时间递归。

第一个电话是

f<Eigen::MatrixBase<Derived> >

第二个是

f<Eigen::Block<Eigen::MatrixBase<Derived>, ... > >

第三个电话是

f<Eigen::Block<Eigen::Block<Eigen::MatrixBase<Derived>, ... >, ... > >

每请求一个块。

在 Eigen 中实现递归函数的最佳实践是什么,它仍然适用于任何 Eigen 矩阵类型?

我想,我应该使用某种类型,它仍然包装着同一块内存,但不是表达式模板,它会被求值。

您可以将递归块转换为 Eigen::Ref 以避免无限类型实例化:

Ref<MatrixXd> bl = m.block(0, 0, blockRows, blockCols);
f(bl);

为了保持完全通用,您可以将 MatrixXd 替换为 typename Derived::PlainObject