Eigen::NullaryExpr вход для оператора

Может кто-нибудь, пожалуйста, помогите мне с пониманием Eigen::NullaryExpr().

У меня есть функтор с оператором () внутри

template<typename Scalar>
  struct scalar_op
    template<typename Index>
    inline const Scalar operator()(Index, Index = 0,bool flag=true) const 
    { 
        if(flag) 
          .....
        else 
          .....
    }
 } 

теперь я использую оператор как

scalar_op<Scalar> _f1;
Matrix<Scalar,Dynamic,-1> samples(int nn)
{    
   return Matrix<Scalar,Dynamic,-1>::NullaryExpr(nn,1,true,_f1);
}

Я получаю сообщение об ошибке вроде:

ошибка C2780: 'const Eigen::CwiseNullaryOp Eigen::DenseBase::NullaryExpr(const CustomNullaryOp &)': ожидается 1 аргумент - 4 предоставлено

без аргумента "bool flag=true", т.е.

inline const Scalar operator()(Index, Index = 0) const

и модификация:

return Matrix<Scalar,Dynamic,-1>::NullaryExpr(nn,1,_f1);

мой код компилируется и работает нормально (в том смысле, что я больше не могу использовать условный оператор в operator()).

Мое непонимание NullaryExpr () вызывает эту ошибку. Мой вопрос заключается в том, как передать аргумент "flag" в оператор (), чтобы я мог использовать его внутри него.

Было бы очень любезно, если бы кто-то объяснил, в чем моя ошибка.

Заранее спасибо.

1 ответ

Вы должны объявить flag как член вашего функтора, который вы инициализируете через его конструктор, например:

template<typename Scalar> struct scalar_op {
  bool m_flag;
  explicit scalar_op(bool flag=true) : m_flag(flag) {}
  template<typename Index>
  inline const Scalar operator()(Index, Index = 0) const 
  { 
    if(m_flag) 
      .....
    else 
      .....
  }
};

и назовите это так:

VectorXd::NullaryExpr(n, scalar_op<double>(false));
Другие вопросы по тегам