It sounds like Zero() cannot be called on a semi-dynamic matrix. May I ask you some explanation about the compilation error below :
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)
Thanks for helping
Sylvain
If one or both sizes of an Eigen::Matrix
are Dynamic
you always need to pass both sizes (unless the fixed size is 1
).
Matrix<double, 3, Dynamic> M = Matrix<double, 3, Dynamic>::Zero(3, 100); // 3x100 zeros
If both sizes are fixed, you can pass both sizes or none (or in fact one size, if the other size is 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., there is a predefined typedef Matrix3Xd
for Matrix<double, 3, Dynamic>
.