Eigen Zero() 功能无法使用半动态矩阵进行编译

Eigen Zero() feature fails to compile with semi-dynamic matrices

听起来好像不能在半动态矩阵上调用 Zero()。 我可以请你解释一下下面的编译错误:

Matrix<double, 3, Dynamic> M = Matrix<double, 3, Dynamic>::Zero(3);



In instantiation of ‘static const Eigen::CwiseNullaryOp<CustomNullaryOp, typename Eigen::internal::conditional<Eigen::internal::is_same<typename Eigen::internal::traits<T>::XprKind, Eigen::MatrixXpr>::value, Eigen::Matrix<typename Eigen::internal::traits<T>::Scalar, Eigen::internal::traits<T>::RowsAtCompileTime, Eigen::internal::traits<T>::ColsAtCompileTime, (AutoAlign | ((Eigen::internal::traits<T>::Flags & Eigen::RowMajorBit) ? RowMajor :  ColMajor)), Eigen::internal::traits<T>::MaxRowsAtCompileTime, Eigen::internal::traits<T>::MaxColsAtCompileTime>, Eigen::Array<typename Eigen::internal::traits<T>::Scalar, Eigen::internal::traits<T>::RowsAtCompileTime, Eigen::internal::traits<T>::ColsAtCompileTime, (AutoAlign | ((Eigen::internal::traits<T>::Flags & Eigen::RowMajorBit) ? RowMajor :  ColMajor)), Eigen::internal::traits<T>::MaxRowsAtCompileTime, Eigen::internal::traits<T>::MaxColsAtCompileTime> >::type> Eigen::DenseBase<Derived>::NullaryExpr(Eigen::Index, const CustomNullaryOp&) [with CustomNullaryOp = Eigen::internal::scalar_constant_op<double>; Derived = Eigen::Matrix<double, 15, -1>; typename Eigen::internal::conditional<Eigen::internal::is_same<typename Eigen::internal::traits<T>::XprKind, Eigen::MatrixXpr>::value, Eigen::Matrix<typename Eigen::internal::traits<T>::Scalar, Eigen::internal::traits<T>::RowsAtCompileTime, Eigen::internal::traits<T>::ColsAtCompileTime, (AutoAlign | ((Eigen::internal::traits<T>::Flags & Eigen::RowMajorBit) ? RowMajor :  ColMajor)), Eigen::internal::traits<T>::MaxRowsAtCompileTime, Eigen::internal::traits<T>::MaxColsAtCompileTime>, Eigen::Array<typename Eigen::internal::traits<T>::Scalar, Eigen::internal::traits<T>::RowsAtCompileTime, Eigen::internal::traits<T>::ColsAtCompileTime, (AutoAlign | ((Eigen::internal::traits<T>::Flags & Eigen::RowMajorBit) ? RowMajor :  ColMajor)), Eigen::internal::traits<T>::MaxRowsAtCompileTime, Eigen::internal::traits<T>::MaxColsAtCompileTime> >::type = Eigen::Matrix<double, 15, -1>; Eigen::Index = long int]’:
/usr/local/include/Eigen/src/Core/CwiseNullaryOp.h:213:41:   required from ‘static const ConstantReturnType Eigen::DenseBase<Derived>::Constant(Eigen::Index, const Scalar&) [with Derived = Eigen::Matrix<double, 15, -1>; Eigen::DenseBase<Derived>::ConstantReturnType = Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, 15, -1> >; typename Eigen::internal::conditional<Eigen::internal::is_same<typename Eigen::internal::traits<T>::XprKind, Eigen::MatrixXpr>::value, Eigen::Matrix<typename Eigen::internal::traits<T>::Scalar, Eigen::internal::traits<T>::RowsAtCompileTime, Eigen::internal::traits<T>::ColsAtCompileTime, (AutoAlign | ((Eigen::internal::traits<T>::Flags & Eigen::RowMajorBit) ? RowMajor :  ColMajor)), Eigen::internal::traits<T>::MaxRowsAtCompileTime, Eigen::internal::traits<T>::MaxColsAtCompileTime>, Eigen::Array<typename Eigen::internal::traits<T>::Scalar, Eigen::internal::traits<T>::RowsAtCompileTime, Eigen::internal::traits<T>::ColsAtCompileTime, (AutoAlign | ((Eigen::internal::traits<T>::Flags & Eigen::RowMajorBit) ? RowMajor :  ColMajor)), Eigen::internal::traits<T>::MaxRowsAtCompileTime, Eigen::internal::traits<T>::MaxColsAtCompileTime> >::type = Eigen::Matrix<double, 15, -1>; typename Eigen::internal::traits<T>::Scalar = double; Eigen::Index = long int; Eigen::DenseBase<Derived>::Scalar = double]’
/usr/local/include/Eigen/src/Core/CwiseNullaryOp.h:472:18:   required from ‘static const ConstantReturnType Eigen::DenseBase<Derived>::Zero(Eigen::Index) [with Derived = Eigen::Matrix<double, 15, -1>; Eigen::DenseBase<Derived>::ConstantReturnType = Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, 15, -1> >; typename Eigen::internal::conditional<Eigen::internal::is_same<typename Eigen::internal::traits<T>::XprKind, Eigen::MatrixXpr>::value, Eigen::Matrix<typename Eigen::internal::traits<T>::Scalar, Eigen::internal::traits<T>::RowsAtCompileTime, Eigen::internal::traits<T>::ColsAtCompileTime, (AutoAlign | ((Eigen::internal::traits<T>::Flags & Eigen::RowMajorBit) ? RowMajor :  ColMajor)), Eigen::internal::traits<T>::MaxRowsAtCompileTime, Eigen::internal::traits<T>::MaxColsAtCompileTime>, Eigen::Array<typename Eigen::internal::traits<T>::Scalar, Eigen::internal::traits<T>::RowsAtCompileTime, Eigen::internal::traits<T>::ColsAtCompileTime, (AutoAlign | ((Eigen::internal::traits<T>::Flags & Eigen::RowMajorBit) ? RowMajor :  ColMajor)), Eigen::internal::traits<T>::MaxRowsAtCompileTime, Eigen::internal::traits<T>::MaxColsAtCompileTime> >::type = Eigen::Matrix<double, 15, -1>; typename Eigen::internal::traits<T>::Scalar = double; Eigen::Index = long int]’
../src/COpdCtrl.cpp:77:49:   required from here
/usr/local/include/Eigen/src/Core/CwiseNullaryOp.h:147:3: error: static assertion failed: YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)

感谢您的帮助

西尔万

如果 Eigen::Matrix 的一个或两个尺寸为 Dynamic,则您始终需要传递两个尺寸(除非固定尺寸为 1)。

Matrix<double, 3, Dynamic> M = Matrix<double, 3, Dynamic>::Zero(3, 100); // 3x100 zeros

如果两个尺寸都是固定的,您可以传递两个尺寸或 none(或者实际上是一个尺寸,如果另一个尺寸是 1):

Matrix<double, 3, 2>::Zero();
Matrix<double, 3, 2>::Zero(3,2); // optionally pass both sizes again
Matrix<double, 3, 1>::Zero(3); // possible as well
Matrix<double, 1, 3>::Zero(3); // also possible

N.B., Matrix<double, 3, Dynamic>.

有一个预定义的类型定义 Matrix3Xd