如何从 Eigen::MatrixBase<Derived> 获取存储选项
How to obtain storage options from Eigen::MatrixBase<Derived>
我正在编写模板函数,它应该将一些 Eigen::MatrixBase<Derived>
作为输入,执行一些计算,然后 return 新的特征值。我想 return 具有与输入相同存储顺序的值。
但是我不知道如何从Eigen::MatrixBase<Derived>
获取存储顺序。在这种情况下我能做什么,这有可能吗?我知道我可以将存储顺序作为另一个模板参数传递,或者接收 Eigen::Matrix<InpScalar, InpStatRows, InpStatCols, InpStorageOrder>
,但如果可能的话,我想避免它
PS对不起我的英语不好
为了回应您对如何声明接收一般矩阵的函数的评论,您可以这样做:
因为函数(和方法)从它们的实际函数参数推导出它们的模板参数,如下所示
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;
}
要查看 MatrixBase<Derived>
的存储顺序,您可以查看 IsRowMajor
枚举:
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;
}
我正在编写模板函数,它应该将一些 Eigen::MatrixBase<Derived>
作为输入,执行一些计算,然后 return 新的特征值。我想 return 具有与输入相同存储顺序的值。
但是我不知道如何从Eigen::MatrixBase<Derived>
获取存储顺序。在这种情况下我能做什么,这有可能吗?我知道我可以将存储顺序作为另一个模板参数传递,或者接收 Eigen::Matrix<InpScalar, InpStatRows, InpStatCols, InpStorageOrder>
,但如果可能的话,我想避免它
PS对不起我的英语不好
为了回应您对如何声明接收一般矩阵的函数的评论,您可以这样做:
因为函数(和方法)从它们的实际函数参数推导出它们的模板参数,如下所示
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;
}
要查看 MatrixBase<Derived>
的存储顺序,您可以查看 IsRowMajor
枚举:
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;
}