C++ C++;特征函数:接受任何矩阵类的递归函数

C++ C++;特征函数:接受任何矩阵类的递归函数,c++,eigen,eigen3,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)); } 模板 void f(本征::矩阵基&m) { 大小\u t块行=。。。 大小\u t blo

我想要一个递归函数

template <typename Derived>
void f(Eigen::MatrixBase<Derived>& m)
{
    size_t blockRows = ...
    size_t blockCols = ...
    ....
    f(m.block(0, 0, blockRows, blockCols));
}
模板
void f(本征::矩阵基&m)
{
大小\u t块行=。。。
大小\u 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>, ... >, ... > >
f
第二种可能是

f<Eigen::MatrixBase<Derived> >
f<Eigen::Block<Eigen::MatrixBase<Derived>, ... > >
f<Eigen::Block<Eigen::Block<Eigen::MatrixBase<Derived>, ... >, ... > >
f
第三个电话是

f<Eigen::MatrixBase<Derived> >
f<Eigen::Block<Eigen::MatrixBase<Derived>, ... > >
f<Eigen::Block<Eigen::Block<Eigen::MatrixBase<Derived>, ... >, ... > >
f
每次请求块的块时

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


我认为,我应该使用某种类型,它仍然包装相同的内存块,但不是表达式模板,而是经过计算的。

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

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

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

我假设您使用了PlainObjectBase,因为没有PlainObjectType。但这并不奏效。我必须将f的签名改为void f(Eigen::Ref&m)才能使它工作。但是当矩阵大小固定时,它就失败了。在这种情况下,m.block(..)的尺寸与导出的尺寸不同。因此,应该将块分配给一个矩阵,该矩阵与派生矩阵相同,但具有动态大小。它是
PlainObject
,而不是
PlainObjectBase
。我修正了答案。