cart-elc

Source code for CART-ELC
git clone git://git.laack.co/cart-elc.git
Log | Files | Refs | README | LICENSE

CwiseNullaryOp.h (36282B)


      1 // This file is part of Eigen, a lightweight C++ template library
      2 // for linear algebra.
      3 //
      4 // Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
      5 //
      6 // This Source Code Form is subject to the terms of the Mozilla
      7 // Public License v. 2.0. If a copy of the MPL was not distributed
      8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
      9 
     10 #ifndef EIGEN_CWISE_NULLARY_OP_H
     11 #define EIGEN_CWISE_NULLARY_OP_H
     12 
     13 namespace Eigen {
     14 
     15 namespace internal {
     16 template<typename NullaryOp, typename PlainObjectType>
     17 struct traits<CwiseNullaryOp<NullaryOp, PlainObjectType> > : traits<PlainObjectType>
     18 {
     19   enum {
     20     Flags = traits<PlainObjectType>::Flags & RowMajorBit
     21   };
     22 };
     23 
     24 } // namespace internal
     25 
     26 /** \class CwiseNullaryOp
     27   * \ingroup Core_Module
     28   *
     29   * \brief Generic expression of a matrix where all coefficients are defined by a functor
     30   *
     31   * \tparam NullaryOp template functor implementing the operator
     32   * \tparam PlainObjectType the underlying plain matrix/array type
     33   *
     34   * This class represents an expression of a generic nullary operator.
     35   * It is the return type of the Ones(), Zero(), Constant(), Identity() and Random() methods,
     36   * and most of the time this is the only way it is used.
     37   *
     38   * However, if you want to write a function returning such an expression, you
     39   * will need to use this class.
     40   *
     41   * The functor NullaryOp must expose one of the following method:
     42     <table class="manual">
     43     <tr            ><td>\c operator()() </td><td>if the procedural generation does not depend on the coefficient entries (e.g., random numbers)</td></tr>
     44     <tr class="alt"><td>\c operator()(Index i)</td><td>if the procedural generation makes sense for vectors only and that it depends on the coefficient index \c i (e.g., linspace) </td></tr>
     45     <tr            ><td>\c operator()(Index i,Index j)</td><td>if the procedural generation depends on the matrix coordinates \c i, \c j (e.g., to generate a checkerboard with 0 and 1)</td></tr>
     46     </table>
     47   * It is also possible to expose the last two operators if the generation makes sense for matrices but can be optimized for vectors.
     48   *
     49   * See DenseBase::NullaryExpr(Index,const CustomNullaryOp&) for an example binding
     50   * C++11 random number generators.
     51   *
     52   * A nullary expression can also be used to implement custom sophisticated matrix manipulations
     53   * that cannot be covered by the existing set of natively supported matrix manipulations.
     54   * See this \ref TopicCustomizing_NullaryExpr "page" for some examples and additional explanations
     55   * on the behavior of CwiseNullaryOp.
     56   *
     57   * \sa class CwiseUnaryOp, class CwiseBinaryOp, DenseBase::NullaryExpr
     58   */
     59 template<typename NullaryOp, typename PlainObjectType>
     60 class CwiseNullaryOp : public internal::dense_xpr_base< CwiseNullaryOp<NullaryOp, PlainObjectType> >::type, internal::no_assignment_operator
     61 {
     62   public:
     63 
     64     typedef typename internal::dense_xpr_base<CwiseNullaryOp>::type Base;
     65     EIGEN_DENSE_PUBLIC_INTERFACE(CwiseNullaryOp)
     66 
     67     EIGEN_DEVICE_FUNC
     68     CwiseNullaryOp(Index rows, Index cols, const NullaryOp& func = NullaryOp())
     69       : m_rows(rows), m_cols(cols), m_functor(func)
     70     {
     71       eigen_assert(rows >= 0
     72             && (RowsAtCompileTime == Dynamic || RowsAtCompileTime == rows)
     73             &&  cols >= 0
     74             && (ColsAtCompileTime == Dynamic || ColsAtCompileTime == cols));
     75     }
     76 
     77     EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
     78     Index rows() const { return m_rows.value(); }
     79     EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
     80     Index cols() const { return m_cols.value(); }
     81 
     82     /** \returns the functor representing the nullary operation */
     83     EIGEN_DEVICE_FUNC
     84     const NullaryOp& functor() const { return m_functor; }
     85 
     86   protected:
     87     const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_rows;
     88     const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_cols;
     89     const NullaryOp m_functor;
     90 };
     91 
     92 
     93 /** \returns an expression of a matrix defined by a custom functor \a func
     94   *
     95   * The parameters \a rows and \a cols are the number of rows and of columns of
     96   * the returned matrix. Must be compatible with this MatrixBase type.
     97   *
     98   * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
     99   * it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used
    100   * instead.
    101   *
    102   * The template parameter \a CustomNullaryOp is the type of the functor.
    103   *
    104   * \sa class CwiseNullaryOp
    105   */
    106 template<typename Derived>
    107 template<typename CustomNullaryOp>
    108 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    109 #ifndef EIGEN_PARSED_BY_DOXYGEN
    110 const CwiseNullaryOp<CustomNullaryOp,typename DenseBase<Derived>::PlainObject>
    111 #else
    112 const CwiseNullaryOp<CustomNullaryOp,PlainObject>
    113 #endif
    114 DenseBase<Derived>::NullaryExpr(Index rows, Index cols, const CustomNullaryOp& func)
    115 {
    116   return CwiseNullaryOp<CustomNullaryOp, PlainObject>(rows, cols, func);
    117 }
    118 
    119 /** \returns an expression of a matrix defined by a custom functor \a func
    120   *
    121   * The parameter \a size is the size of the returned vector.
    122   * Must be compatible with this MatrixBase type.
    123   *
    124   * \only_for_vectors
    125   *
    126   * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
    127   * it is redundant to pass \a size as argument, so Zero() should be used
    128   * instead.
    129   *
    130   * The template parameter \a CustomNullaryOp is the type of the functor.
    131   *
    132   * Here is an example with C++11 random generators: \include random_cpp11.cpp
    133   * Output: \verbinclude random_cpp11.out
    134   *
    135   * \sa class CwiseNullaryOp
    136   */
    137 template<typename Derived>
    138 template<typename CustomNullaryOp>
    139 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    140 #ifndef EIGEN_PARSED_BY_DOXYGEN
    141 const CwiseNullaryOp<CustomNullaryOp, typename DenseBase<Derived>::PlainObject>
    142 #else
    143 const CwiseNullaryOp<CustomNullaryOp, PlainObject>
    144 #endif
    145 DenseBase<Derived>::NullaryExpr(Index size, const CustomNullaryOp& func)
    146 {
    147   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    148   if(RowsAtCompileTime == 1) return CwiseNullaryOp<CustomNullaryOp, PlainObject>(1, size, func);
    149   else return CwiseNullaryOp<CustomNullaryOp, PlainObject>(size, 1, func);
    150 }
    151 
    152 /** \returns an expression of a matrix defined by a custom functor \a func
    153   *
    154   * This variant is only for fixed-size DenseBase types. For dynamic-size types, you
    155   * need to use the variants taking size arguments.
    156   *
    157   * The template parameter \a CustomNullaryOp is the type of the functor.
    158   *
    159   * \sa class CwiseNullaryOp
    160   */
    161 template<typename Derived>
    162 template<typename CustomNullaryOp>
    163 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    164 #ifndef EIGEN_PARSED_BY_DOXYGEN
    165 const CwiseNullaryOp<CustomNullaryOp, typename DenseBase<Derived>::PlainObject>
    166 #else
    167 const CwiseNullaryOp<CustomNullaryOp, PlainObject>
    168 #endif
    169 DenseBase<Derived>::NullaryExpr(const CustomNullaryOp& func)
    170 {
    171   return CwiseNullaryOp<CustomNullaryOp, PlainObject>(RowsAtCompileTime, ColsAtCompileTime, func);
    172 }
    173 
    174 /** \returns an expression of a constant matrix of value \a value
    175   *
    176   * The parameters \a rows and \a cols are the number of rows and of columns of
    177   * the returned matrix. Must be compatible with this DenseBase type.
    178   *
    179   * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
    180   * it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used
    181   * instead.
    182   *
    183   * The template parameter \a CustomNullaryOp is the type of the functor.
    184   *
    185   * \sa class CwiseNullaryOp
    186   */
    187 template<typename Derived>
    188 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
    189 DenseBase<Derived>::Constant(Index rows, Index cols, const Scalar& value)
    190 {
    191   return DenseBase<Derived>::NullaryExpr(rows, cols, internal::scalar_constant_op<Scalar>(value));
    192 }
    193 
    194 /** \returns an expression of a constant matrix of value \a value
    195   *
    196   * The parameter \a size is the size of the returned vector.
    197   * Must be compatible with this DenseBase type.
    198   *
    199   * \only_for_vectors
    200   *
    201   * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
    202   * it is redundant to pass \a size as argument, so Zero() should be used
    203   * instead.
    204   *
    205   * The template parameter \a CustomNullaryOp is the type of the functor.
    206   *
    207   * \sa class CwiseNullaryOp
    208   */
    209 template<typename Derived>
    210 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
    211 DenseBase<Derived>::Constant(Index size, const Scalar& value)
    212 {
    213   return DenseBase<Derived>::NullaryExpr(size, internal::scalar_constant_op<Scalar>(value));
    214 }
    215 
    216 /** \returns an expression of a constant matrix of value \a value
    217   *
    218   * This variant is only for fixed-size DenseBase types. For dynamic-size types, you
    219   * need to use the variants taking size arguments.
    220   *
    221   * The template parameter \a CustomNullaryOp is the type of the functor.
    222   *
    223   * \sa class CwiseNullaryOp
    224   */
    225 template<typename Derived>
    226 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
    227 DenseBase<Derived>::Constant(const Scalar& value)
    228 {
    229   EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
    230   return DenseBase<Derived>::NullaryExpr(RowsAtCompileTime, ColsAtCompileTime, internal::scalar_constant_op<Scalar>(value));
    231 }
    232 
    233 /** \deprecated because of accuracy loss. In Eigen 3.3, it is an alias for LinSpaced(Index,const Scalar&,const Scalar&)
    234   *
    235   * \only_for_vectors
    236   *
    237   * Example: \include DenseBase_LinSpaced_seq_deprecated.cpp
    238   * Output: \verbinclude DenseBase_LinSpaced_seq_deprecated.out
    239   *
    240   * \sa LinSpaced(Index,const Scalar&, const Scalar&), setLinSpaced(Index,const Scalar&,const Scalar&)
    241   */
    242 template<typename Derived>
    243 EIGEN_DEPRECATED EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
    244 DenseBase<Derived>::LinSpaced(Sequential_t, Index size, const Scalar& low, const Scalar& high)
    245 {
    246   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    247   return DenseBase<Derived>::NullaryExpr(size, internal::linspaced_op<Scalar>(low,high,size));
    248 }
    249 
    250 /** \deprecated because of accuracy loss. In Eigen 3.3, it is an alias for LinSpaced(const Scalar&,const Scalar&)
    251   *
    252   * \sa LinSpaced(const Scalar&, const Scalar&)
    253   */
    254 template<typename Derived>
    255 EIGEN_DEPRECATED EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
    256 DenseBase<Derived>::LinSpaced(Sequential_t, const Scalar& low, const Scalar& high)
    257 {
    258   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    259   EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
    260   return DenseBase<Derived>::NullaryExpr(Derived::SizeAtCompileTime, internal::linspaced_op<Scalar>(low,high,Derived::SizeAtCompileTime));
    261 }
    262 
    263 /**
    264   * \brief Sets a linearly spaced vector.
    265   *
    266   * The function generates 'size' equally spaced values in the closed interval [low,high].
    267   * When size is set to 1, a vector of length 1 containing 'high' is returned.
    268   *
    269   * \only_for_vectors
    270   *
    271   * Example: \include DenseBase_LinSpaced.cpp
    272   * Output: \verbinclude DenseBase_LinSpaced.out
    273   *
    274   * For integer scalar types, an even spacing is possible if and only if the length of the range,
    275   * i.e., \c high-low is a scalar multiple of \c size-1, or if \c size is a scalar multiple of the
    276   * number of values \c high-low+1 (meaning each value can be repeated the same number of time).
    277   * If one of these two considions is not satisfied, then \c high is lowered to the largest value
    278   * satisfying one of this constraint.
    279   * Here are some examples:
    280   *
    281   * Example: \include DenseBase_LinSpacedInt.cpp
    282   * Output: \verbinclude DenseBase_LinSpacedInt.out
    283   *
    284   * \sa setLinSpaced(Index,const Scalar&,const Scalar&), CwiseNullaryOp
    285   */
    286 template<typename Derived>
    287 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
    288 DenseBase<Derived>::LinSpaced(Index size, const Scalar& low, const Scalar& high)
    289 {
    290   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    291   return DenseBase<Derived>::NullaryExpr(size, internal::linspaced_op<Scalar>(low,high,size));
    292 }
    293 
    294 /**
    295   * \copydoc DenseBase::LinSpaced(Index, const Scalar&, const Scalar&)
    296   * Special version for fixed size types which does not require the size parameter.
    297   */
    298 template<typename Derived>
    299 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
    300 DenseBase<Derived>::LinSpaced(const Scalar& low, const Scalar& high)
    301 {
    302   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    303   EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
    304   return DenseBase<Derived>::NullaryExpr(Derived::SizeAtCompileTime, internal::linspaced_op<Scalar>(low,high,Derived::SizeAtCompileTime));
    305 }
    306 
    307 /** \returns true if all coefficients in this matrix are approximately equal to \a val, to within precision \a prec */
    308 template<typename Derived>
    309 EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isApproxToConstant
    310 (const Scalar& val, const RealScalar& prec) const
    311 {
    312   typename internal::nested_eval<Derived,1>::type self(derived());
    313   for(Index j = 0; j < cols(); ++j)
    314     for(Index i = 0; i < rows(); ++i)
    315       if(!internal::isApprox(self.coeff(i, j), val, prec))
    316         return false;
    317   return true;
    318 }
    319 
    320 /** This is just an alias for isApproxToConstant().
    321   *
    322   * \returns true if all coefficients in this matrix are approximately equal to \a value, to within precision \a prec */
    323 template<typename Derived>
    324 EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isConstant
    325 (const Scalar& val, const RealScalar& prec) const
    326 {
    327   return isApproxToConstant(val, prec);
    328 }
    329 
    330 /** Alias for setConstant(): sets all coefficients in this expression to \a val.
    331   *
    332   * \sa setConstant(), Constant(), class CwiseNullaryOp
    333   */
    334 template<typename Derived>
    335 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void DenseBase<Derived>::fill(const Scalar& val)
    336 {
    337   setConstant(val);
    338 }
    339 
    340 /** Sets all coefficients in this expression to value \a val.
    341   *
    342   * \sa fill(), setConstant(Index,const Scalar&), setConstant(Index,Index,const Scalar&), setZero(), setOnes(), Constant(), class CwiseNullaryOp, setZero(), setOnes()
    343   */
    344 template<typename Derived>
    345 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setConstant(const Scalar& val)
    346 {
    347   return derived() = Constant(rows(), cols(), val);
    348 }
    349 
    350 /** Resizes to the given \a size, and sets all coefficients in this expression to the given value \a val.
    351   *
    352   * \only_for_vectors
    353   *
    354   * Example: \include Matrix_setConstant_int.cpp
    355   * Output: \verbinclude Matrix_setConstant_int.out
    356   *
    357   * \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&)
    358   */
    359 template<typename Derived>
    360 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
    361 PlainObjectBase<Derived>::setConstant(Index size, const Scalar& val)
    362 {
    363   resize(size);
    364   return setConstant(val);
    365 }
    366 
    367 /** Resizes to the given size, and sets all coefficients in this expression to the given value \a val.
    368   *
    369   * \param rows the new number of rows
    370   * \param cols the new number of columns
    371   * \param val the value to which all coefficients are set
    372   *
    373   * Example: \include Matrix_setConstant_int_int.cpp
    374   * Output: \verbinclude Matrix_setConstant_int_int.out
    375   *
    376   * \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&)
    377   */
    378 template<typename Derived>
    379 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
    380 PlainObjectBase<Derived>::setConstant(Index rows, Index cols, const Scalar& val)
    381 {
    382   resize(rows, cols);
    383   return setConstant(val);
    384 }
    385 
    386 /** Resizes to the given size, changing only the number of columns, and sets all
    387   * coefficients in this expression to the given value \a val. For the parameter
    388   * of type NoChange_t, just pass the special value \c NoChange.
    389   *
    390   * \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&)
    391   */
    392 template<typename Derived>
    393 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
    394 PlainObjectBase<Derived>::setConstant(NoChange_t, Index cols, const Scalar& val)
    395 {
    396   return setConstant(rows(), cols, val);
    397 }
    398 
    399 /** Resizes to the given size, changing only the number of rows, and sets all
    400   * coefficients in this expression to the given value \a val. For the parameter
    401   * of type NoChange_t, just pass the special value \c NoChange.
    402   *
    403   * \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&)
    404   */
    405 template<typename Derived>
    406 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
    407 PlainObjectBase<Derived>::setConstant(Index rows, NoChange_t, const Scalar& val)
    408 {
    409   return setConstant(rows, cols(), val);
    410 }
    411 
    412 
    413 /**
    414   * \brief Sets a linearly spaced vector.
    415   *
    416   * The function generates 'size' equally spaced values in the closed interval [low,high].
    417   * When size is set to 1, a vector of length 1 containing 'high' is returned.
    418   *
    419   * \only_for_vectors
    420   *
    421   * Example: \include DenseBase_setLinSpaced.cpp
    422   * Output: \verbinclude DenseBase_setLinSpaced.out
    423   *
    424   * For integer scalar types, do not miss the explanations on the definition
    425   * of \link LinSpaced(Index,const Scalar&,const Scalar&) even spacing \endlink.
    426   *
    427   * \sa LinSpaced(Index,const Scalar&,const Scalar&), CwiseNullaryOp
    428   */
    429 template<typename Derived>
    430 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setLinSpaced(Index newSize, const Scalar& low, const Scalar& high)
    431 {
    432   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    433   return derived() = Derived::NullaryExpr(newSize, internal::linspaced_op<Scalar>(low,high,newSize));
    434 }
    435 
    436 /**
    437   * \brief Sets a linearly spaced vector.
    438   *
    439   * The function fills \c *this with equally spaced values in the closed interval [low,high].
    440   * When size is set to 1, a vector of length 1 containing 'high' is returned.
    441   *
    442   * \only_for_vectors
    443   *
    444   * For integer scalar types, do not miss the explanations on the definition
    445   * of \link LinSpaced(Index,const Scalar&,const Scalar&) even spacing \endlink.
    446   *
    447   * \sa LinSpaced(Index,const Scalar&,const Scalar&), setLinSpaced(Index, const Scalar&, const Scalar&), CwiseNullaryOp
    448   */
    449 template<typename Derived>
    450 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setLinSpaced(const Scalar& low, const Scalar& high)
    451 {
    452   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    453   return setLinSpaced(size(), low, high);
    454 }
    455 
    456 // zero:
    457 
    458 /** \returns an expression of a zero matrix.
    459   *
    460   * The parameters \a rows and \a cols are the number of rows and of columns of
    461   * the returned matrix. Must be compatible with this MatrixBase type.
    462   *
    463   * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
    464   * it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used
    465   * instead.
    466   *
    467   * Example: \include MatrixBase_zero_int_int.cpp
    468   * Output: \verbinclude MatrixBase_zero_int_int.out
    469   *
    470   * \sa Zero(), Zero(Index)
    471   */
    472 template<typename Derived>
    473 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
    474 DenseBase<Derived>::Zero(Index rows, Index cols)
    475 {
    476   return Constant(rows, cols, Scalar(0));
    477 }
    478 
    479 /** \returns an expression of a zero vector.
    480   *
    481   * The parameter \a size is the size of the returned vector.
    482   * Must be compatible with this MatrixBase type.
    483   *
    484   * \only_for_vectors
    485   *
    486   * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
    487   * it is redundant to pass \a size as argument, so Zero() should be used
    488   * instead.
    489   *
    490   * Example: \include MatrixBase_zero_int.cpp
    491   * Output: \verbinclude MatrixBase_zero_int.out
    492   *
    493   * \sa Zero(), Zero(Index,Index)
    494   */
    495 template<typename Derived>
    496 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
    497 DenseBase<Derived>::Zero(Index size)
    498 {
    499   return Constant(size, Scalar(0));
    500 }
    501 
    502 /** \returns an expression of a fixed-size zero matrix or vector.
    503   *
    504   * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you
    505   * need to use the variants taking size arguments.
    506   *
    507   * Example: \include MatrixBase_zero.cpp
    508   * Output: \verbinclude MatrixBase_zero.out
    509   *
    510   * \sa Zero(Index), Zero(Index,Index)
    511   */
    512 template<typename Derived>
    513 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
    514 DenseBase<Derived>::Zero()
    515 {
    516   return Constant(Scalar(0));
    517 }
    518 
    519 /** \returns true if *this is approximately equal to the zero matrix,
    520   *          within the precision given by \a prec.
    521   *
    522   * Example: \include MatrixBase_isZero.cpp
    523   * Output: \verbinclude MatrixBase_isZero.out
    524   *
    525   * \sa class CwiseNullaryOp, Zero()
    526   */
    527 template<typename Derived>
    528 EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isZero(const RealScalar& prec) const
    529 {
    530   typename internal::nested_eval<Derived,1>::type self(derived());
    531   for(Index j = 0; j < cols(); ++j)
    532     for(Index i = 0; i < rows(); ++i)
    533       if(!internal::isMuchSmallerThan(self.coeff(i, j), static_cast<Scalar>(1), prec))
    534         return false;
    535   return true;
    536 }
    537 
    538 /** Sets all coefficients in this expression to zero.
    539   *
    540   * Example: \include MatrixBase_setZero.cpp
    541   * Output: \verbinclude MatrixBase_setZero.out
    542   *
    543   * \sa class CwiseNullaryOp, Zero()
    544   */
    545 template<typename Derived>
    546 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setZero()
    547 {
    548   return setConstant(Scalar(0));
    549 }
    550 
    551 /** Resizes to the given \a size, and sets all coefficients in this expression to zero.
    552   *
    553   * \only_for_vectors
    554   *
    555   * Example: \include Matrix_setZero_int.cpp
    556   * Output: \verbinclude Matrix_setZero_int.out
    557   *
    558   * \sa DenseBase::setZero(), setZero(Index,Index), class CwiseNullaryOp, DenseBase::Zero()
    559   */
    560 template<typename Derived>
    561 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
    562 PlainObjectBase<Derived>::setZero(Index newSize)
    563 {
    564   resize(newSize);
    565   return setConstant(Scalar(0));
    566 }
    567 
    568 /** Resizes to the given size, and sets all coefficients in this expression to zero.
    569   *
    570   * \param rows the new number of rows
    571   * \param cols the new number of columns
    572   *
    573   * Example: \include Matrix_setZero_int_int.cpp
    574   * Output: \verbinclude Matrix_setZero_int_int.out
    575   *
    576   * \sa DenseBase::setZero(), setZero(Index), class CwiseNullaryOp, DenseBase::Zero()
    577   */
    578 template<typename Derived>
    579 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
    580 PlainObjectBase<Derived>::setZero(Index rows, Index cols)
    581 {
    582   resize(rows, cols);
    583   return setConstant(Scalar(0));
    584 }
    585 
    586 /** Resizes to the given size, changing only the number of columns, and sets all
    587   * coefficients in this expression to zero. For the parameter of type NoChange_t,
    588   * just pass the special value \c NoChange.
    589   *
    590   * \sa DenseBase::setZero(), setZero(Index), setZero(Index, Index), setZero(Index, NoChange_t), class CwiseNullaryOp, DenseBase::Zero()
    591   */
    592 template<typename Derived>
    593 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
    594 PlainObjectBase<Derived>::setZero(NoChange_t, Index cols)
    595 {
    596   return setZero(rows(), cols);
    597 }
    598 
    599 /** Resizes to the given size, changing only the number of rows, and sets all
    600   * coefficients in this expression to zero. For the parameter of type NoChange_t,
    601   * just pass the special value \c NoChange.
    602   *
    603   * \sa DenseBase::setZero(), setZero(Index), setZero(Index, Index), setZero(NoChange_t, Index), class CwiseNullaryOp, DenseBase::Zero()
    604   */
    605 template<typename Derived>
    606 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
    607 PlainObjectBase<Derived>::setZero(Index rows, NoChange_t)
    608 {
    609   return setZero(rows, cols());
    610 }
    611 
    612 // ones:
    613 
    614 /** \returns an expression of a matrix where all coefficients equal one.
    615   *
    616   * The parameters \a rows and \a cols are the number of rows and of columns of
    617   * the returned matrix. Must be compatible with this MatrixBase type.
    618   *
    619   * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
    620   * it is redundant to pass \a rows and \a cols as arguments, so Ones() should be used
    621   * instead.
    622   *
    623   * Example: \include MatrixBase_ones_int_int.cpp
    624   * Output: \verbinclude MatrixBase_ones_int_int.out
    625   *
    626   * \sa Ones(), Ones(Index), isOnes(), class Ones
    627   */
    628 template<typename Derived>
    629 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
    630 DenseBase<Derived>::Ones(Index rows, Index cols)
    631 {
    632   return Constant(rows, cols, Scalar(1));
    633 }
    634 
    635 /** \returns an expression of a vector where all coefficients equal one.
    636   *
    637   * The parameter \a newSize is the size of the returned vector.
    638   * Must be compatible with this MatrixBase type.
    639   *
    640   * \only_for_vectors
    641   *
    642   * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
    643   * it is redundant to pass \a size as argument, so Ones() should be used
    644   * instead.
    645   *
    646   * Example: \include MatrixBase_ones_int.cpp
    647   * Output: \verbinclude MatrixBase_ones_int.out
    648   *
    649   * \sa Ones(), Ones(Index,Index), isOnes(), class Ones
    650   */
    651 template<typename Derived>
    652 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
    653 DenseBase<Derived>::Ones(Index newSize)
    654 {
    655   return Constant(newSize, Scalar(1));
    656 }
    657 
    658 /** \returns an expression of a fixed-size matrix or vector where all coefficients equal one.
    659   *
    660   * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you
    661   * need to use the variants taking size arguments.
    662   *
    663   * Example: \include MatrixBase_ones.cpp
    664   * Output: \verbinclude MatrixBase_ones.out
    665   *
    666   * \sa Ones(Index), Ones(Index,Index), isOnes(), class Ones
    667   */
    668 template<typename Derived>
    669 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
    670 DenseBase<Derived>::Ones()
    671 {
    672   return Constant(Scalar(1));
    673 }
    674 
    675 /** \returns true if *this is approximately equal to the matrix where all coefficients
    676   *          are equal to 1, within the precision given by \a prec.
    677   *
    678   * Example: \include MatrixBase_isOnes.cpp
    679   * Output: \verbinclude MatrixBase_isOnes.out
    680   *
    681   * \sa class CwiseNullaryOp, Ones()
    682   */
    683 template<typename Derived>
    684 EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isOnes
    685 (const RealScalar& prec) const
    686 {
    687   return isApproxToConstant(Scalar(1), prec);
    688 }
    689 
    690 /** Sets all coefficients in this expression to one.
    691   *
    692   * Example: \include MatrixBase_setOnes.cpp
    693   * Output: \verbinclude MatrixBase_setOnes.out
    694   *
    695   * \sa class CwiseNullaryOp, Ones()
    696   */
    697 template<typename Derived>
    698 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setOnes()
    699 {
    700   return setConstant(Scalar(1));
    701 }
    702 
    703 /** Resizes to the given \a newSize, and sets all coefficients in this expression to one.
    704   *
    705   * \only_for_vectors
    706   *
    707   * Example: \include Matrix_setOnes_int.cpp
    708   * Output: \verbinclude Matrix_setOnes_int.out
    709   *
    710   * \sa MatrixBase::setOnes(), setOnes(Index,Index), class CwiseNullaryOp, MatrixBase::Ones()
    711   */
    712 template<typename Derived>
    713 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
    714 PlainObjectBase<Derived>::setOnes(Index newSize)
    715 {
    716   resize(newSize);
    717   return setConstant(Scalar(1));
    718 }
    719 
    720 /** Resizes to the given size, and sets all coefficients in this expression to one.
    721   *
    722   * \param rows the new number of rows
    723   * \param cols the new number of columns
    724   *
    725   * Example: \include Matrix_setOnes_int_int.cpp
    726   * Output: \verbinclude Matrix_setOnes_int_int.out
    727   *
    728   * \sa MatrixBase::setOnes(), setOnes(Index), class CwiseNullaryOp, MatrixBase::Ones()
    729   */
    730 template<typename Derived>
    731 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
    732 PlainObjectBase<Derived>::setOnes(Index rows, Index cols)
    733 {
    734   resize(rows, cols);
    735   return setConstant(Scalar(1));
    736 }
    737 
    738 /** Resizes to the given size, changing only the number of rows, and sets all
    739   * coefficients in this expression to one. For the parameter of type NoChange_t,
    740   * just pass the special value \c NoChange.
    741   *
    742  * \sa MatrixBase::setOnes(), setOnes(Index), setOnes(Index, Index), setOnes(NoChange_t, Index), class CwiseNullaryOp, MatrixBase::Ones()
    743   */
    744 template<typename Derived>
    745 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
    746 PlainObjectBase<Derived>::setOnes(Index rows, NoChange_t)
    747 {
    748   return setOnes(rows, cols());
    749 }
    750 
    751 /** Resizes to the given size, changing only the number of columns, and sets all
    752   * coefficients in this expression to one. For the parameter of type NoChange_t,
    753   * just pass the special value \c NoChange.
    754   *
    755  * \sa MatrixBase::setOnes(), setOnes(Index), setOnes(Index, Index), setOnes(Index, NoChange_t) class CwiseNullaryOp, MatrixBase::Ones()
    756   */
    757 template<typename Derived>
    758 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
    759 PlainObjectBase<Derived>::setOnes(NoChange_t, Index cols)
    760 {
    761   return setOnes(rows(), cols);
    762 }
    763 
    764 // Identity:
    765 
    766 /** \returns an expression of the identity matrix (not necessarily square).
    767   *
    768   * The parameters \a rows and \a cols are the number of rows and of columns of
    769   * the returned matrix. Must be compatible with this MatrixBase type.
    770   *
    771   * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
    772   * it is redundant to pass \a rows and \a cols as arguments, so Identity() should be used
    773   * instead.
    774   *
    775   * Example: \include MatrixBase_identity_int_int.cpp
    776   * Output: \verbinclude MatrixBase_identity_int_int.out
    777   *
    778   * \sa Identity(), setIdentity(), isIdentity()
    779   */
    780 template<typename Derived>
    781 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::IdentityReturnType
    782 MatrixBase<Derived>::Identity(Index rows, Index cols)
    783 {
    784   return DenseBase<Derived>::NullaryExpr(rows, cols, internal::scalar_identity_op<Scalar>());
    785 }
    786 
    787 /** \returns an expression of the identity matrix (not necessarily square).
    788   *
    789   * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you
    790   * need to use the variant taking size arguments.
    791   *
    792   * Example: \include MatrixBase_identity.cpp
    793   * Output: \verbinclude MatrixBase_identity.out
    794   *
    795   * \sa Identity(Index,Index), setIdentity(), isIdentity()
    796   */
    797 template<typename Derived>
    798 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::IdentityReturnType
    799 MatrixBase<Derived>::Identity()
    800 {
    801   EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
    802   return MatrixBase<Derived>::NullaryExpr(RowsAtCompileTime, ColsAtCompileTime, internal::scalar_identity_op<Scalar>());
    803 }
    804 
    805 /** \returns true if *this is approximately equal to the identity matrix
    806   *          (not necessarily square),
    807   *          within the precision given by \a prec.
    808   *
    809   * Example: \include MatrixBase_isIdentity.cpp
    810   * Output: \verbinclude MatrixBase_isIdentity.out
    811   *
    812   * \sa class CwiseNullaryOp, Identity(), Identity(Index,Index), setIdentity()
    813   */
    814 template<typename Derived>
    815 bool MatrixBase<Derived>::isIdentity
    816 (const RealScalar& prec) const
    817 {
    818   typename internal::nested_eval<Derived,1>::type self(derived());
    819   for(Index j = 0; j < cols(); ++j)
    820   {
    821     for(Index i = 0; i < rows(); ++i)
    822     {
    823       if(i == j)
    824       {
    825         if(!internal::isApprox(self.coeff(i, j), static_cast<Scalar>(1), prec))
    826           return false;
    827       }
    828       else
    829       {
    830         if(!internal::isMuchSmallerThan(self.coeff(i, j), static_cast<RealScalar>(1), prec))
    831           return false;
    832       }
    833     }
    834   }
    835   return true;
    836 }
    837 
    838 namespace internal {
    839 
    840 template<typename Derived, bool Big = (Derived::SizeAtCompileTime>=16)>
    841 struct setIdentity_impl
    842 {
    843   EIGEN_DEVICE_FUNC
    844   static EIGEN_STRONG_INLINE Derived& run(Derived& m)
    845   {
    846     return m = Derived::Identity(m.rows(), m.cols());
    847   }
    848 };
    849 
    850 template<typename Derived>
    851 struct setIdentity_impl<Derived, true>
    852 {
    853   EIGEN_DEVICE_FUNC
    854   static EIGEN_STRONG_INLINE Derived& run(Derived& m)
    855   {
    856     m.setZero();
    857     const Index size = numext::mini(m.rows(), m.cols());
    858     for(Index i = 0; i < size; ++i) m.coeffRef(i,i) = typename Derived::Scalar(1);
    859     return m;
    860   }
    861 };
    862 
    863 } // end namespace internal
    864 
    865 /** Writes the identity expression (not necessarily square) into *this.
    866   *
    867   * Example: \include MatrixBase_setIdentity.cpp
    868   * Output: \verbinclude MatrixBase_setIdentity.out
    869   *
    870   * \sa class CwiseNullaryOp, Identity(), Identity(Index,Index), isIdentity()
    871   */
    872 template<typename Derived>
    873 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setIdentity()
    874 {
    875   return internal::setIdentity_impl<Derived>::run(derived());
    876 }
    877 
    878 /** \brief Resizes to the given size, and writes the identity expression (not necessarily square) into *this.
    879   *
    880   * \param rows the new number of rows
    881   * \param cols the new number of columns
    882   *
    883   * Example: \include Matrix_setIdentity_int_int.cpp
    884   * Output: \verbinclude Matrix_setIdentity_int_int.out
    885   *
    886   * \sa MatrixBase::setIdentity(), class CwiseNullaryOp, MatrixBase::Identity()
    887   */
    888 template<typename Derived>
    889 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setIdentity(Index rows, Index cols)
    890 {
    891   derived().resize(rows, cols);
    892   return setIdentity();
    893 }
    894 
    895 /** \returns an expression of the i-th unit (basis) vector.
    896   *
    897   * \only_for_vectors
    898   *
    899   * \sa MatrixBase::Unit(Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
    900   */
    901 template<typename Derived>
    902 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::Unit(Index newSize, Index i)
    903 {
    904   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    905   return BasisReturnType(SquareMatrixType::Identity(newSize,newSize), i);
    906 }
    907 
    908 /** \returns an expression of the i-th unit (basis) vector.
    909   *
    910   * \only_for_vectors
    911   *
    912   * This variant is for fixed-size vector only.
    913   *
    914   * \sa MatrixBase::Unit(Index,Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
    915   */
    916 template<typename Derived>
    917 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::Unit(Index i)
    918 {
    919   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    920   return BasisReturnType(SquareMatrixType::Identity(),i);
    921 }
    922 
    923 /** \returns an expression of the X axis unit vector (1{,0}^*)
    924   *
    925   * \only_for_vectors
    926   *
    927   * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
    928   */
    929 template<typename Derived>
    930 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitX()
    931 { return Derived::Unit(0); }
    932 
    933 /** \returns an expression of the Y axis unit vector (0,1{,0}^*)
    934   *
    935   * \only_for_vectors
    936   *
    937   * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
    938   */
    939 template<typename Derived>
    940 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitY()
    941 { return Derived::Unit(1); }
    942 
    943 /** \returns an expression of the Z axis unit vector (0,0,1{,0}^*)
    944   *
    945   * \only_for_vectors
    946   *
    947   * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
    948   */
    949 template<typename Derived>
    950 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitZ()
    951 { return Derived::Unit(2); }
    952 
    953 /** \returns an expression of the W axis unit vector (0,0,0,1)
    954   *
    955   * \only_for_vectors
    956   *
    957   * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
    958   */
    959 template<typename Derived>
    960 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitW()
    961 { return Derived::Unit(3); }
    962 
    963 /** \brief Set the coefficients of \c *this to the i-th unit (basis) vector
    964   *
    965   * \param i index of the unique coefficient to be set to 1
    966   *
    967   * \only_for_vectors
    968   *
    969   * \sa MatrixBase::setIdentity(), class CwiseNullaryOp, MatrixBase::Unit(Index,Index)
    970   */
    971 template<typename Derived>
    972 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setUnit(Index i)
    973 {
    974   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
    975   eigen_assert(i<size());
    976   derived().setZero();
    977   derived().coeffRef(i) = Scalar(1);
    978   return derived();
    979 }
    980 
    981 /** \brief Resizes to the given \a newSize, and writes the i-th unit (basis) vector into *this.
    982   *
    983   * \param newSize the new size of the vector
    984   * \param i index of the unique coefficient to be set to 1
    985   *
    986   * \only_for_vectors
    987   *
    988   * \sa MatrixBase::setIdentity(), class CwiseNullaryOp, MatrixBase::Unit(Index,Index)
    989   */
    990 template<typename Derived>
    991 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setUnit(Index newSize, Index i)
    992 {
    993   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
    994   eigen_assert(i<newSize);
    995   derived().resize(newSize);
    996   return setUnit(i);
    997 }
    998 
    999 } // end namespace Eigen
   1000 
   1001 #endif // EIGEN_CWISE_NULLARY_OP_H