0

我有进一步的问题继续我之前的问题。现在我想在一种类型中传递两种特征参数:(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

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

提前致谢!

4

1 回答 1

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
于 2014-04-11T08:30:56.563 回答