如何从 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;
}