Search code examples
c++castingeigen

Numeric type from coefficient wise comparisons in eigen


I want to create an array from the comparison of an array with a scalar. What type should this array be?

Here is my code:

Eigen::ArrayXXd eig_arr = Eigen::ArrayXXd::Random(n_rows,n_components);
//std::cout << (eig_arr >30 )<< std::endl; //the result here is correct
Eigen::ArrayXXd mask = Eigen::ArrayXXd::Zero(eig_arr.rows(), eig_arr.cols());
mask = (eig_arr >30 ); 

I get YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY I have looked up the cast method but still I don't know which type cast to.

This is the complete error I get :

    e:\dev\eigen\eigen\src/Core/Assign.h(493): error C2338: YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY
          e:\dev\eigen\eigen\src/Core/PlainObjectBase.h(414) : see reference to function template instantiation 'Derived &Eigen::DenseBase<Derived>::lazyAssign<Eigen::CwiseUnaryOp<UnaryOp,XprType>>(const Eigen::DenseBase<Eigen::CwiseUnaryOp<UnaryOp,XprType>> &)' being compiled
          with
          [
              Derived=Eigen::Array<double,-1,-,
              UnaryOp=std::binder2nd<std::greater<double>>,
              XprType=const Eigen::Array<double,-1,-
          ]
          e:\dev\eigen\eigen\src/Core/PlainObjectBase.h(414) : see reference to function template instantiation 'Derived &Eigen::DenseBase<Derived>::lazyAssign<Eigen::CwiseUnaryOp<UnaryOp,XprType>>(const Eigen::DenseBase<Eigen::CwiseUnaryOp<UnaryOp,XprType>> &)' being compiled
          with
          [
              Derived=Eigen::Array<double,-1,-,
              UnaryOp=std::binder2nd<std::greater<double>>,
              XprType=const Eigen::Array<double,-1,-
          ]
          e:\dev\eigen\eigen\src/Core/Assign.h(520) : see reference to function template instantiation 'Derived &Eigen::PlainObjectBase<Derived>::lazyAssign<Eigen::CwiseUnaryOp<UnaryOp,XprType>>(const Eigen::DenseBase<Eigen::CwiseUnaryOp<UnaryOp,XprType>> &)' being compiled
          with
          [
              Derived=Eigen::Array<double,-1,-,
              UnaryOp=std::binder2nd<std::greater<double>>,
              XprType=const Eigen::Array<double,-1,-
          ]
          e:\dev\eigen\eigen\src/Core/Assign.h(520) : see reference to function template instantiation 'Derived &Eigen::PlainObjectBase<Derived>::lazyAssign<Eigen::CwiseUnaryOp<UnaryOp,XprType>>(const Eigen::DenseBase<Eigen::CwiseUnaryOp<UnaryOp,XprType>> &)' being compiled
          with
          [
              Derived=Eigen::Array<double,-1,-,
              UnaryOp=std::binder2nd<std::greater<double>>,
              XprType=const Eigen::Array<double,-1,-
          ]
          e:\dev\eigen\eigen\src/Core/Assign.h(520) : while compiling class template member function 'Eigen::Array<_Scalar,_Rows,_Cols> &Eigen::internal::assign_selector<Derived,OtherDerived,EvalBeforeAssigning>::run(Derived &,const OtherDerived &)'
          with
          [
              _Scalar=double,
              _Rows=-1,
              _Cols=-1,
              Derived=Eigen::Array<double,-1,-,
              OtherDerived=Eigen::CwiseUnaryOp<std::binder2nd<std::greater<double>>,const Eigen::Array<double,-1,->,
              EvalBeforeAssigning=false
          ]
          e:\dev\eigen\eigen\src/Core/PlainObjectBase.h(621) : see reference to function template instantiation 'Eigen::Array<_Scalar,_Rows,_Cols> &Eigen::internal::assign_selector<Derived,OtherDerived,EvalBeforeAssigning>::run(Derived &,const OtherDerived &)' being compiled
          with
          [
              _Scalar=double,
              _Rows=-1,
              _Cols=-1,
              Derived=Eigen::Array<double,-1,-,
              OtherDerived=Eigen::CwiseUnaryOp<std::binder2nd<std::greater<double>>,const Eigen::Array<double,-1,->,
              EvalBeforeAssigning=false
          ]
          e:\dev\eigen\eigen\src/Core/PlainObjectBase.h(621) : see reference to class template instantiation 'Eigen::internal::assign_selector<Derived,OtherDerived,EvalBeforeAssigning>' being compiled
          with
          [
              Derived=Eigen::Array<double,-1,-,
              OtherDerived=Eigen::CwiseUnaryOp<std::binder2nd<std::greater<double>>,const Eigen::Array<double,-1,->,
              EvalBeforeAssigning=false
          ]
          e:\dev\eigen\eigen\src/Core/PlainObjectBase.h(606) : see reference to function template instantiation 'Derived &Eigen::PlainObjectBase<Derived>::_set_noalias<Eigen::CwiseUnaryOp<UnaryOp,XprType>>(const Eigen::DenseBase<Eigen::CwiseUnaryOp<UnaryOp,XprType>> &)' being compiled
          with
          [
              Derived=Eigen::Array<double,-1,-,
              UnaryOp=std::binder2nd<std::greater<double>>,
              XprType=const Eigen::Array<double,-1,-
          ]
          e:\dev\eigen\eigen\src/Core/PlainObjectBase.h(606) : see reference to function template instantiation 'Derived &Eigen::PlainObjectBase<Derived>::_set_noalias<Eigen::CwiseUnaryOp<UnaryOp,XprType>>(const Eigen::DenseBase<Eigen::CwiseUnaryOp<UnaryOp,XprType>> &)' being compiled
          with
          [
              Derived=Eigen::Array<double,-1,-,
              UnaryOp=std::binder2nd<std::greater<double>>,
              XprType=const Eigen::Array<double,-1,-
          ]
          e:\dev\eigen\eigen\src/Core/PlainObjectBase.h(598) : see reference to function template instantiation 'void Eigen::PlainObjectBase<Derived>::_set_selector<Eigen::CwiseUnaryOp<UnaryOp,XprType>>(const OtherDerived &,const Eigen::internal::false_type &)' being compiled
          with
          [
              Derived=Eigen::Array<double,-1,-,
              UnaryOp=std::binder2nd<std::greater<double>>,
              XprType=const Eigen::Array<double,-1,-,
              OtherDerived=Eigen::CwiseUnaryOp<std::binder2nd<std::greater<double>>,const Eigen::Array<double,-1,->
          ]
          e:\dev\eigen\eigen\src/Core/PlainObjectBase.h(598) : see reference to function template instantiation 'void Eigen::PlainObjectBase<Derived>::_set_selector<Eigen::CwiseUnaryOp<UnaryOp,XprType>>(const OtherDerived &,const Eigen::internal::false_type &)' being compiled
          with
          [
              Derived=Eigen::Array<double,-1,-,
              UnaryOp=std::binder2nd<std::greater<double>>,
              XprType=const Eigen::Array<double,-1,-,
              OtherDerived=Eigen::CwiseUnaryOp<std::binder2nd<std::greater<double>>,const Eigen::Array<double,-1,->
          ]
          e:\dev\eigen\eigen\src/Core/Array.h(89) : see reference to function template instantiation 'Derived &Eigen::PlainObjectBase<Derived>::_set<Eigen::CwiseUnaryOp<UnaryOp,XprType>>(const Eigen::DenseBase<Eigen::CwiseUnaryOp<UnaryOp,XprType>> &)' being compiled
          with
          [
              Derived=Eigen::Array<double,-1,-,
              UnaryOp=std::binder2nd<std::greater<double>>,
              XprType=const Eigen::Array<double,-1,-
          ]
          e:\dev\eigen\eigen\src/Core/Array.h(89) : see reference to function template instantiation 'Derived &Eigen::PlainObjectBase<Derived>::_set<Eigen::CwiseUnaryOp<UnaryOp,XprType>>(const Eigen::DenseBase<Eigen::CwiseUnaryOp<UnaryOp,XprType>> &)' being compiled
          with
          [
              Derived=Eigen::Array<double,-1,-,
              UnaryOp=std::binder2nd<std::greater<double>>,
              XprType=const Eigen::Array<double,-1,-
          ]
          ..\test.cxx(76) : see reference to function template instantiation 'Eigen::Array<_Scalar,_Rows,_Cols> &Eigen::Array<_Scalar,_Rows,_Cols>::operator =<Derived>(const Eigen::ArrayBase<Derived> &)' being compiled
          with
          [
              _Scalar=double,
              _Rows=-1,
              _Cols=-1,
              Derived=Eigen::CwiseUnaryOp<std::binder2nd<std::greater<double>>,const Eigen::Array<double,-1,->
          ]
          ..\test.cxx(76) : see reference to function template instantiation 'Eigen::Array<_Scalar,_Rows,_Cols> &Eigen::Array<_Scalar,_Rows,_Cols>::operator =<Derived>(const Eigen::ArrayBase<Derived> &)' being compiled
          with
          [
              _Scalar=double,
              _Rows=-1,
              _Cols=-1,
              Derived=Eigen::CwiseUnaryOp<std::binder2nd<std::greater<double>>,const Eigen::Array<double,-1,->
          ]

Solution

  • eig_arr > 30 returns an expression of bools, so if you want doubles, then you have to explicitly cast bools to doubles as follow:

    mask = (eig_arr >30 ).cast<double>()