Eigen3:在模板函数中的一种数据类型中传递固定大小矩阵和动态大小矩阵

时间:2014-03-26 02:03:19

标签: templates eigen3

我还有问题继续my previous question。现在我想在一种类型中传递两种特征参数:(1)固定大小的矩阵或(2)行是固定的但是cols是动态的。两个矩阵的行总是应该是3.你的修改函数是:

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);
  assert(v.rows() == 3);

  typename Derived::PlainObject ret;

  std::cout << "v size  : "   << v.rows() << ", " << v.cols()   << std::endl;
  std::cout << "ret size: " << ret.rows() << ", " << ret.cols() << std::endl;

  return ret;
}

我想创建变量,其大小与函数中传递的参数v相同。传递固定大小的矩阵很好,但不适用于动态(列)大小矩阵。动态尺寸矩阵的ret列数为0。

void main()
{
  int n = 1000;

  Eigen::Matrix<double, 3, Dynamic> A1 = Eigen::Matrix<double, 3, Dynamic>::Random(3, n);
  Eigen::Matrix<double, 3, 1000>    B1 = Eigen::Matrix<double, 3, 1000>::Random();

  Eigen::Matrix<double, 3, Dynamic> A2 = bar(A1);
  Eigen::Matrix<double, 3, 1000>    B2 = bar(B1);
}

输出:

v size  : 3, 1000
ret size: 3, 0
v size  : 3, 1000
ret size: 3, 1000

是否有一致的方法来创建变量,其大小与固定大小矩阵和动态(列)大小矩阵的传递参数相同?或者无法在一种数据类型中传递它们?

提前致谢!

1 个答案:

答案 0 :(得分:2)

由于列数仅在运行时已知(它不属于该类型),因此您需要在创建矩阵ret时指定它,如下所示:

template<typename Derived>
typename Derived::PlainObject bar(const Eigen::MatrixBase<Derived>& v)
{
    typename Derived::PlainObject ret(v.rows(), v.cols());

    std::cout << "v size  : "   << v.rows() << ", " << v.cols()   << std::endl;
    std::cout << "ret size: " << ret.rows() << ", " << ret.cols() << std::endl;

    return ret;
}

在此更改后,您会在以下两种情况下获得预期答案:

v size  : 3, 1000
ret size: 3, 1000
v size  : 3, 1000
ret size: 3, 1000