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

时间:2016-03-18 17:25:51

标签: c++ eigen eigen3

我想要一个递归函数

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中实现递归函数的最佳实践是什么,它仍适用于任何特征矩阵类型?

我认为,我应该使用某种类型,它仍然包含相同的内存,但不是表达式模板,它会被评估。

1 个答案:

答案 0 :(得分:2)

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

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

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