Функция Eigen Zero() не компилируется с полудинамическими матрицами

Похоже, 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)

Спасибо за помощь

Сильвен


person sylwa06    schedule 22.11.2019    source источник


Ответы (1)


Если один или оба размера Eigen::Matrix равны Dynamic, вам всегда нужно передавать оба размера (если только фиксированный размер не равен 1).

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

Если оба размера фиксированы, вы можете передать оба размера или ни одного (или фактически один размер, если другой размер равен 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> существует предопределенный typedef Matrix3Xd.

person chtz    schedule 22.11.2019
comment
Спасибо за помощь, чтц, я пришел к такому выводу после пары попыток, но мне это кажется непоследовательным. Спасибо за Ваше подтверждение. Ваше здоровье ! Сильвен - person sylwa06; 22.11.2019