如何从 Eigen::MatrixBase <Derived>获取存储选项



我正在编写模板函数,它应该将一些Eigen::MatrixBase<Derived>作为输入,执行一些计算,然后返回新的特征值。我想返回与输入相同的存储顺序的值。

但是我不知道如何从Eigen::MatrixBase<Derived>获取存储订单。在这种情况下我能做什么,有可能吗?我知道我可以将存储订单作为另一个模板参数传递,或者接收Eigen::Matrix<InpScalar, InpStatRows, InpStatCols, InpStorageOrder>,但如果可能的话,我想避免它

PS对不起我的英语不好

要查看MatrixBase<Derived>的存储顺序,可以检查 enumIsRowMajor

int const StorageOrder = Derived::IsRowMajor ? Eigen::RowMajor : Eigen::ColMajor;

如果要具有与Derived具有相同存储顺序和大小的类型,则可以直接使用typename Derived::PlainObject(或PlainMatrix(:

template<class Derived>
typename Derived::PlainObject foo(const Eigen::MatrixBase<Derived> & input)
{
typename Derived::PlainObject return_value;
// do some complicated calculations
return return_value;
}

为了回应你关于如何声明一个接收通用矩阵的函数的评论,你可以做这样的事情:

由于函数(和方法(从其实际函数参数中推导出其模板参数,如下所示

template <typename InpScalar, int InpStatRows, int InpStatCols, int InpStorageOrder>
void foo(Eigen::Matrix<InpScalar, InpStatRows, InpStatCols, InpStorageOrder>& matrix)
{
//you can utilize InpStorageOrder here
}

matrix输入参数的模板参数将被自动推导,这意味着您在调用函数时不必显式指定它们,只需传递它Eigen::Matrix

有关如何从另一个函数调用函数的示例

void bar()
{
Eigen::Matrix<double, 3, 3, Eigen::RowMajor> mat;
foo(mat);
}

如果您只想获取给定矩阵的存储顺序,如果Eigen库中不存在任何内容来执行此操作,那么您可以为特征矩阵实现类型特征

template <typename TMatrix>
struct MatrixTraits {};
//Partial specialization of MatrixTraits class template
//will accept only `Eigen::Matrix` classes as its template argument
template <typename InpScalar, int InpStatRows, int InpStatCols, int InpStorageOrder>
struct MatrixTraits<Eigen::Matrix<InpScalar, InpStatRows, InpStatCols, InpStorageOrder>>
{
int StorageOrder = InpStorageOrder;
};

要利用这一点,您可以像这样做:

void bar()
{
Eigen::Matrix<double, 3, 3, Eigen::RowMajor> mat;
int StorageOrder = MatrixTraits<decltype(mat)>::StorageOrder;
}

相关内容

  • 没有找到相关文章

最新更新