xref: /aosp_15_r20/external/eigen/Eigen/src/Core/CwiseNullaryOp.h (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2008-2010 Gael Guennebaud <[email protected]>
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
1002