我正在编写模板函数,它应该将一些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;
}