固定大小的特征矩阵作为模板函数中的参数

时间:2014-03-23 01:29:31

标签: templates block fixed operation eigen3

我正在尝试使用模板在矩阵大小上编写一个采用固定大小矩阵的函数。我读过http://eigen.tuxfamily.org/dox/TopicFunctionTakingEigenTypes.html,但我无法让它完美无缺。我不能在我的函数内的固定大小矩阵上使用固定大小的矩阵块操作。 (TutorialBlockOperations.html“> HTTP://eigen.tuxfamily.org/dox/group_TutorialBlockOperations.html)

我试图以两种方式做到这一点,但两者都不起作用。

这是函数定义A:

template <int N>
Matrix<double, 3, N> foo(const Matrix<double, 3, N>& v)
{
  Matrix<double, 3, N> ret;

  Vector3d a = v.leftCols<1>();  // error: expected primary-expression before ')' token

  return ret;
}

这是函数定义B:

template<typename Derived>
Eigen::MatrixBase<Derived> bar(const Eigen::MatrixBase<Derived>& v)
{
  EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived);
  EIGEN_STATIC_ASSERT(Derived::RowsAtCompileTime == 3,
                  THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE);

  Eigen::Matrix<double,
      Derived::RowsAtCompileTime,
      Derived::ColsAtCompileTime> ret;

  Vector3d a = v.leftCols<1>();  // error: expected primary-expression before ')' token

  return ret;
}

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

版本B中的参数是正确的,b!t不是应该是Derived::PlainObject的返回类型。您还需要模板消歧关键字来访问模板化代码中的模板成员:

template<typename Derived>
typename Derived::PlainObject bar(const Eigen::MatrixBase<Derived>& v)
{
  EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived);
  EIGEN_STATIC_ASSERT(Derived::RowsAtCompileTime == 3,
                      THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE);

  typename Derived::PlainObject ret;

  Vector3d a = v.template leftCols<1>();

  return ret;
}