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
78     EIGEN_STRONG_INLINE Index rows() const { return m_rows.value(); }
79     EIGEN_DEVICE_FUNC
80     EIGEN_STRONG_INLINE 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 const CwiseNullaryOp<CustomNullaryOp, typename DenseBase<Derived>::PlainObject>
109 DenseBase<Derived>::NullaryExpr(Index rows, Index cols, const CustomNullaryOp& func)
110 {
111   return CwiseNullaryOp<CustomNullaryOp, PlainObject>(rows, cols, func);
112 }
113 
114 /** \returns an expression of a matrix defined by a custom functor \a func
115   *
116   * The parameter \a size is the size of the returned vector.
117   * Must be compatible with this MatrixBase type.
118   *
119   * \only_for_vectors
120   *
121   * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
122   * it is redundant to pass \a size as argument, so Zero() should be used
123   * instead.
124   *
125   * The template parameter \a CustomNullaryOp is the type of the functor.
126   *
127   * Here is an example with C++11 random generators: \include random_cpp11.cpp
128   * Output: \verbinclude random_cpp11.out
129   *
130   * \sa class CwiseNullaryOp
131   */
132 template<typename Derived>
133 template<typename CustomNullaryOp>
134 EIGEN_STRONG_INLINE const CwiseNullaryOp<CustomNullaryOp, typename DenseBase<Derived>::PlainObject>
135 DenseBase<Derived>::NullaryExpr(Index size, const CustomNullaryOp& func)
136 {
137   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
138   if(RowsAtCompileTime == 1) return CwiseNullaryOp<CustomNullaryOp, PlainObject>(1, size, func);
139   else return CwiseNullaryOp<CustomNullaryOp, PlainObject>(size, 1, func);
140 }
141 
142 /** \returns an expression of a matrix defined by a custom functor \a func
143   *
144   * This variant is only for fixed-size DenseBase types. For dynamic-size types, you
145   * need to use the variants taking size arguments.
146   *
147   * The template parameter \a CustomNullaryOp is the type of the functor.
148   *
149   * \sa class CwiseNullaryOp
150   */
151 template<typename Derived>
152 template<typename CustomNullaryOp>
153 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseNullaryOp<CustomNullaryOp, typename DenseBase<Derived>::PlainObject>
154 DenseBase<Derived>::NullaryExpr(const CustomNullaryOp& func)
155 {
156   return CwiseNullaryOp<CustomNullaryOp, PlainObject>(RowsAtCompileTime, ColsAtCompileTime, func);
157 }
158 
159 /** \returns an expression of a constant matrix of value \a value
160   *
161   * The parameters \a rows and \a cols are the number of rows and of columns of
162   * the returned matrix. Must be compatible with this DenseBase type.
163   *
164   * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
165   * it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used
166   * instead.
167   *
168   * The template parameter \a CustomNullaryOp is the type of the functor.
169   *
170   * \sa class CwiseNullaryOp
171   */
172 template<typename Derived>
173 EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
174 DenseBase<Derived>::Constant(Index rows, Index cols, const Scalar& value)
175 {
176   return DenseBase<Derived>::NullaryExpr(rows, cols, internal::scalar_constant_op<Scalar>(value));
177 }
178 
179 /** \returns an expression of a constant matrix of value \a value
180   *
181   * The parameter \a size is the size of the returned vector.
182   * Must be compatible with this DenseBase type.
183   *
184   * \only_for_vectors
185   *
186   * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
187   * it is redundant to pass \a size as argument, so Zero() should be used
188   * instead.
189   *
190   * The template parameter \a CustomNullaryOp is the type of the functor.
191   *
192   * \sa class CwiseNullaryOp
193   */
194 template<typename Derived>
195 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
196 DenseBase<Derived>::Constant(Index size, const Scalar& value)
197 {
198   return DenseBase<Derived>::NullaryExpr(size, internal::scalar_constant_op<Scalar>(value));
199 }
200 
201 /** \returns an expression of a constant matrix of value \a value
202   *
203   * This variant is only for fixed-size DenseBase types. For dynamic-size types, you
204   * need to use the variants taking size arguments.
205   *
206   * The template parameter \a CustomNullaryOp is the type of the functor.
207   *
208   * \sa class CwiseNullaryOp
209   */
210 template<typename Derived>
211 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
212 DenseBase<Derived>::Constant(const Scalar& value)
213 {
214   EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
215   return DenseBase<Derived>::NullaryExpr(RowsAtCompileTime, ColsAtCompileTime, internal::scalar_constant_op<Scalar>(value));
216 }
217 
218 /** \deprecated because of accuracy loss. In Eigen 3.3, it is an alias for LinSpaced(Index,const Scalar&,const Scalar&)
219   *
220   * \sa LinSpaced(Index,Scalar,Scalar), setLinSpaced(Index,const Scalar&,const Scalar&)
221   */
222 template<typename Derived>
223 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
224 DenseBase<Derived>::LinSpaced(Sequential_t, Index size, const Scalar& low, const Scalar& high)
225 {
226   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
227   return DenseBase<Derived>::NullaryExpr(size, internal::linspaced_op<Scalar,PacketScalar>(low,high,size));
228 }
229 
230 /** \deprecated because of accuracy loss. In Eigen 3.3, it is an alias for LinSpaced(const Scalar&,const Scalar&)
231   *
232   * \sa LinSpaced(Scalar,Scalar)
233   */
234 template<typename Derived>
235 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
236 DenseBase<Derived>::LinSpaced(Sequential_t, const Scalar& low, const Scalar& high)
237 {
238   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
239   EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
240   return DenseBase<Derived>::NullaryExpr(Derived::SizeAtCompileTime, internal::linspaced_op<Scalar,PacketScalar>(low,high,Derived::SizeAtCompileTime));
241 }
242 
243 /**
244   * \brief Sets a linearly spaced vector.
245   *
246   * The function generates 'size' equally spaced values in the closed interval [low,high].
247   * When size is set to 1, a vector of length 1 containing 'high' is returned.
248   *
249   * \only_for_vectors
250   *
251   * Example: \include DenseBase_LinSpaced.cpp
252   * Output: \verbinclude DenseBase_LinSpaced.out
253   *
254   * For integer scalar types, an even spacing is possible if and only if the length of the range,
255   * i.e., \c high-low is a scalar multiple of \c size-1, or if \c size is a scalar multiple of the
256   * number of values \c high-low+1 (meaning each value can be repeated the same number of time).
257   * If one of these two considions is not satisfied, then \c high is lowered to the largest value
258   * satisfying one of this constraint.
259   * Here are some examples:
260   *
261   * Example: \include DenseBase_LinSpacedInt.cpp
262   * Output: \verbinclude DenseBase_LinSpacedInt.out
263   *
264   * \sa setLinSpaced(Index,const Scalar&,const Scalar&), CwiseNullaryOp
265   */
266 template<typename Derived>
267 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
268 DenseBase<Derived>::LinSpaced(Index size, const Scalar& low, const Scalar& high)
269 {
270   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
271   return DenseBase<Derived>::NullaryExpr(size, internal::linspaced_op<Scalar,PacketScalar>(low,high,size));
272 }
273 
274 /**
275   * \copydoc DenseBase::LinSpaced(Index, const Scalar&, const Scalar&)
276   * Special version for fixed size types which does not require the size parameter.
277   */
278 template<typename Derived>
279 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
280 DenseBase<Derived>::LinSpaced(const Scalar& low, const Scalar& high)
281 {
282   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
283   EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
284   return DenseBase<Derived>::NullaryExpr(Derived::SizeAtCompileTime, internal::linspaced_op<Scalar,PacketScalar>(low,high,Derived::SizeAtCompileTime));
285 }
286 
287 /** \returns true if all coefficients in this matrix are approximately equal to \a val, to within precision \a prec */
288 template<typename Derived>
289 EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isApproxToConstant
290 (const Scalar& val, const RealScalar& prec) const
291 {
292   typename internal::nested_eval<Derived,1>::type self(derived());
293   for(Index j = 0; j < cols(); ++j)
294     for(Index i = 0; i < rows(); ++i)
295       if(!internal::isApprox(self.coeff(i, j), val, prec))
296         return false;
297   return true;
298 }
299 
300 /** This is just an alias for isApproxToConstant().
301   *
302   * \returns true if all coefficients in this matrix are approximately equal to \a value, to within precision \a prec */
303 template<typename Derived>
304 EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isConstant
305 (const Scalar& val, const RealScalar& prec) const
306 {
307   return isApproxToConstant(val, prec);
308 }
309 
310 /** Alias for setConstant(): sets all coefficients in this expression to \a val.
311   *
312   * \sa setConstant(), Constant(), class CwiseNullaryOp
313   */
314 template<typename Derived>
315 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void DenseBase<Derived>::fill(const Scalar& val)
316 {
317   setConstant(val);
318 }
319 
320 /** Sets all coefficients in this expression to value \a val.
321   *
322   * \sa fill(), setConstant(Index,const Scalar&), setConstant(Index,Index,const Scalar&), setZero(), setOnes(), Constant(), class CwiseNullaryOp, setZero(), setOnes()
323   */
324 template<typename Derived>
325 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setConstant(const Scalar& val)
326 {
327   return derived() = Constant(rows(), cols(), val);
328 }
329 
330 /** Resizes to the given \a size, and sets all coefficients in this expression to the given value \a val.
331   *
332   * \only_for_vectors
333   *
334   * Example: \include Matrix_setConstant_int.cpp
335   * Output: \verbinclude Matrix_setConstant_int.out
336   *
337   * \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&)
338   */
339 template<typename Derived>
340 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
341 PlainObjectBase<Derived>::setConstant(Index size, const Scalar& val)
342 {
343   resize(size);
344   return setConstant(val);
345 }
346 
347 /** Resizes to the given size, and sets all coefficients in this expression to the given value \a val.
348   *
349   * \param rows the new number of rows
350   * \param cols the new number of columns
351   * \param val the value to which all coefficients are set
352   *
353   * Example: \include Matrix_setConstant_int_int.cpp
354   * Output: \verbinclude Matrix_setConstant_int_int.out
355   *
356   * \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&)
357   */
358 template<typename Derived>
359 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
360 PlainObjectBase<Derived>::setConstant(Index rows, Index cols, const Scalar& val)
361 {
362   resize(rows, cols);
363   return setConstant(val);
364 }
365 
366 /**
367   * \brief Sets a linearly spaced vector.
368   *
369   * The function generates 'size' equally spaced values in the closed interval [low,high].
370   * When size is set to 1, a vector of length 1 containing 'high' is returned.
371   *
372   * \only_for_vectors
373   *
374   * Example: \include DenseBase_setLinSpaced.cpp
375   * Output: \verbinclude DenseBase_setLinSpaced.out
376   *
377   * For integer scalar types, do not miss the explanations on the definition
378   * of \link LinSpaced(Index,const Scalar&,const Scalar&) even spacing \endlink.
379   *
380   * \sa LinSpaced(Index,const Scalar&,const Scalar&), CwiseNullaryOp
381   */
382 template<typename Derived>
383 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setLinSpaced(Index newSize, const Scalar& low, const Scalar& high)
384 {
385   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
386   return derived() = Derived::NullaryExpr(newSize, internal::linspaced_op<Scalar,PacketScalar>(low,high,newSize));
387 }
388 
389 /**
390   * \brief Sets a linearly spaced vector.
391   *
392   * The function fills \c *this with equally spaced values in the closed interval [low,high].
393   * When size is set to 1, a vector of length 1 containing 'high' is returned.
394   *
395   * \only_for_vectors
396   *
397   * For integer scalar types, do not miss the explanations on the definition
398   * of \link LinSpaced(Index,const Scalar&,const Scalar&) even spacing \endlink.
399   *
400   * \sa LinSpaced(Index,const Scalar&,const Scalar&), setLinSpaced(Index, const Scalar&, const Scalar&), CwiseNullaryOp
401   */
402 template<typename Derived>
403 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setLinSpaced(const Scalar& low, const Scalar& high)
404 {
405   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
406   return setLinSpaced(size(), low, high);
407 }
408 
409 // zero:
410 
411 /** \returns an expression of a zero matrix.
412   *
413   * The parameters \a rows and \a cols are the number of rows and of columns of
414   * the returned matrix. Must be compatible with this MatrixBase type.
415   *
416   * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
417   * it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used
418   * instead.
419   *
420   * Example: \include MatrixBase_zero_int_int.cpp
421   * Output: \verbinclude MatrixBase_zero_int_int.out
422   *
423   * \sa Zero(), Zero(Index)
424   */
425 template<typename Derived>
426 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
427 DenseBase<Derived>::Zero(Index rows, Index cols)
428 {
429   return Constant(rows, cols, Scalar(0));
430 }
431 
432 /** \returns an expression of a zero vector.
433   *
434   * The parameter \a size is the size of the returned vector.
435   * Must be compatible with this MatrixBase type.
436   *
437   * \only_for_vectors
438   *
439   * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
440   * it is redundant to pass \a size as argument, so Zero() should be used
441   * instead.
442   *
443   * Example: \include MatrixBase_zero_int.cpp
444   * Output: \verbinclude MatrixBase_zero_int.out
445   *
446   * \sa Zero(), Zero(Index,Index)
447   */
448 template<typename Derived>
449 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
450 DenseBase<Derived>::Zero(Index size)
451 {
452   return Constant(size, Scalar(0));
453 }
454 
455 /** \returns an expression of a fixed-size zero matrix or vector.
456   *
457   * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you
458   * need to use the variants taking size arguments.
459   *
460   * Example: \include MatrixBase_zero.cpp
461   * Output: \verbinclude MatrixBase_zero.out
462   *
463   * \sa Zero(Index), Zero(Index,Index)
464   */
465 template<typename Derived>
466 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
467 DenseBase<Derived>::Zero()
468 {
469   return Constant(Scalar(0));
470 }
471 
472 /** \returns true if *this is approximately equal to the zero matrix,
473   *          within the precision given by \a prec.
474   *
475   * Example: \include MatrixBase_isZero.cpp
476   * Output: \verbinclude MatrixBase_isZero.out
477   *
478   * \sa class CwiseNullaryOp, Zero()
479   */
480 template<typename Derived>
481 EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isZero(const RealScalar& prec) const
482 {
483   typename internal::nested_eval<Derived,1>::type self(derived());
484   for(Index j = 0; j < cols(); ++j)
485     for(Index i = 0; i < rows(); ++i)
486       if(!internal::isMuchSmallerThan(self.coeff(i, j), static_cast<Scalar>(1), prec))
487         return false;
488   return true;
489 }
490 
491 /** Sets all coefficients in this expression to zero.
492   *
493   * Example: \include MatrixBase_setZero.cpp
494   * Output: \verbinclude MatrixBase_setZero.out
495   *
496   * \sa class CwiseNullaryOp, Zero()
497   */
498 template<typename Derived>
499 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setZero()
500 {
501   return setConstant(Scalar(0));
502 }
503 
504 /** Resizes to the given \a size, and sets all coefficients in this expression to zero.
505   *
506   * \only_for_vectors
507   *
508   * Example: \include Matrix_setZero_int.cpp
509   * Output: \verbinclude Matrix_setZero_int.out
510   *
511   * \sa DenseBase::setZero(), setZero(Index,Index), class CwiseNullaryOp, DenseBase::Zero()
512   */
513 template<typename Derived>
514 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
515 PlainObjectBase<Derived>::setZero(Index newSize)
516 {
517   resize(newSize);
518   return setConstant(Scalar(0));
519 }
520 
521 /** Resizes to the given size, and sets all coefficients in this expression to zero.
522   *
523   * \param rows the new number of rows
524   * \param cols the new number of columns
525   *
526   * Example: \include Matrix_setZero_int_int.cpp
527   * Output: \verbinclude Matrix_setZero_int_int.out
528   *
529   * \sa DenseBase::setZero(), setZero(Index), class CwiseNullaryOp, DenseBase::Zero()
530   */
531 template<typename Derived>
532 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
533 PlainObjectBase<Derived>::setZero(Index rows, Index cols)
534 {
535   resize(rows, cols);
536   return setConstant(Scalar(0));
537 }
538 
539 // ones:
540 
541 /** \returns an expression of a matrix where all coefficients equal one.
542   *
543   * The parameters \a rows and \a cols are the number of rows and of columns of
544   * the returned matrix. Must be compatible with this MatrixBase type.
545   *
546   * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
547   * it is redundant to pass \a rows and \a cols as arguments, so Ones() should be used
548   * instead.
549   *
550   * Example: \include MatrixBase_ones_int_int.cpp
551   * Output: \verbinclude MatrixBase_ones_int_int.out
552   *
553   * \sa Ones(), Ones(Index), isOnes(), class Ones
554   */
555 template<typename Derived>
556 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
557 DenseBase<Derived>::Ones(Index rows, Index cols)
558 {
559   return Constant(rows, cols, Scalar(1));
560 }
561 
562 /** \returns an expression of a vector where all coefficients equal one.
563   *
564   * The parameter \a newSize is the size of the returned vector.
565   * Must be compatible with this MatrixBase type.
566   *
567   * \only_for_vectors
568   *
569   * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
570   * it is redundant to pass \a size as argument, so Ones() should be used
571   * instead.
572   *
573   * Example: \include MatrixBase_ones_int.cpp
574   * Output: \verbinclude MatrixBase_ones_int.out
575   *
576   * \sa Ones(), Ones(Index,Index), isOnes(), class Ones
577   */
578 template<typename Derived>
579 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
580 DenseBase<Derived>::Ones(Index newSize)
581 {
582   return Constant(newSize, Scalar(1));
583 }
584 
585 /** \returns an expression of a fixed-size matrix or vector where all coefficients equal one.
586   *
587   * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you
588   * need to use the variants taking size arguments.
589   *
590   * Example: \include MatrixBase_ones.cpp
591   * Output: \verbinclude MatrixBase_ones.out
592   *
593   * \sa Ones(Index), Ones(Index,Index), isOnes(), class Ones
594   */
595 template<typename Derived>
596 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
597 DenseBase<Derived>::Ones()
598 {
599   return Constant(Scalar(1));
600 }
601 
602 /** \returns true if *this is approximately equal to the matrix where all coefficients
603   *          are equal to 1, within the precision given by \a prec.
604   *
605   * Example: \include MatrixBase_isOnes.cpp
606   * Output: \verbinclude MatrixBase_isOnes.out
607   *
608   * \sa class CwiseNullaryOp, Ones()
609   */
610 template<typename Derived>
611 EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isOnes
612 (const RealScalar& prec) const
613 {
614   return isApproxToConstant(Scalar(1), prec);
615 }
616 
617 /** Sets all coefficients in this expression to one.
618   *
619   * Example: \include MatrixBase_setOnes.cpp
620   * Output: \verbinclude MatrixBase_setOnes.out
621   *
622   * \sa class CwiseNullaryOp, Ones()
623   */
624 template<typename Derived>
625 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setOnes()
626 {
627   return setConstant(Scalar(1));
628 }
629 
630 /** Resizes to the given \a newSize, and sets all coefficients in this expression to one.
631   *
632   * \only_for_vectors
633   *
634   * Example: \include Matrix_setOnes_int.cpp
635   * Output: \verbinclude Matrix_setOnes_int.out
636   *
637   * \sa MatrixBase::setOnes(), setOnes(Index,Index), class CwiseNullaryOp, MatrixBase::Ones()
638   */
639 template<typename Derived>
640 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
641 PlainObjectBase<Derived>::setOnes(Index newSize)
642 {
643   resize(newSize);
644   return setConstant(Scalar(1));
645 }
646 
647 /** Resizes to the given size, and sets all coefficients in this expression to one.
648   *
649   * \param rows the new number of rows
650   * \param cols the new number of columns
651   *
652   * Example: \include Matrix_setOnes_int_int.cpp
653   * Output: \verbinclude Matrix_setOnes_int_int.out
654   *
655   * \sa MatrixBase::setOnes(), setOnes(Index), class CwiseNullaryOp, MatrixBase::Ones()
656   */
657 template<typename Derived>
658 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
659 PlainObjectBase<Derived>::setOnes(Index rows, Index cols)
660 {
661   resize(rows, cols);
662   return setConstant(Scalar(1));
663 }
664 
665 // Identity:
666 
667 /** \returns an expression of the identity matrix (not necessarily square).
668   *
669   * The parameters \a rows and \a cols are the number of rows and of columns of
670   * the returned matrix. Must be compatible with this MatrixBase type.
671   *
672   * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
673   * it is redundant to pass \a rows and \a cols as arguments, so Identity() should be used
674   * instead.
675   *
676   * Example: \include MatrixBase_identity_int_int.cpp
677   * Output: \verbinclude MatrixBase_identity_int_int.out
678   *
679   * \sa Identity(), setIdentity(), isIdentity()
680   */
681 template<typename Derived>
682 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::IdentityReturnType
683 MatrixBase<Derived>::Identity(Index rows, Index cols)
684 {
685   return DenseBase<Derived>::NullaryExpr(rows, cols, internal::scalar_identity_op<Scalar>());
686 }
687 
688 /** \returns an expression of the identity matrix (not necessarily square).
689   *
690   * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you
691   * need to use the variant taking size arguments.
692   *
693   * Example: \include MatrixBase_identity.cpp
694   * Output: \verbinclude MatrixBase_identity.out
695   *
696   * \sa Identity(Index,Index), setIdentity(), isIdentity()
697   */
698 template<typename Derived>
699 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::IdentityReturnType
700 MatrixBase<Derived>::Identity()
701 {
702   EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
703   return MatrixBase<Derived>::NullaryExpr(RowsAtCompileTime, ColsAtCompileTime, internal::scalar_identity_op<Scalar>());
704 }
705 
706 /** \returns true if *this is approximately equal to the identity matrix
707   *          (not necessarily square),
708   *          within the precision given by \a prec.
709   *
710   * Example: \include MatrixBase_isIdentity.cpp
711   * Output: \verbinclude MatrixBase_isIdentity.out
712   *
713   * \sa class CwiseNullaryOp, Identity(), Identity(Index,Index), setIdentity()
714   */
715 template<typename Derived>
716 bool MatrixBase<Derived>::isIdentity
717 (const RealScalar& prec) const
718 {
719   typename internal::nested_eval<Derived,1>::type self(derived());
720   for(Index j = 0; j < cols(); ++j)
721   {
722     for(Index i = 0; i < rows(); ++i)
723     {
724       if(i == j)
725       {
726         if(!internal::isApprox(self.coeff(i, j), static_cast<Scalar>(1), prec))
727           return false;
728       }
729       else
730       {
731         if(!internal::isMuchSmallerThan(self.coeff(i, j), static_cast<RealScalar>(1), prec))
732           return false;
733       }
734     }
735   }
736   return true;
737 }
738 
739 namespace internal {
740 
741 template<typename Derived, bool Big = (Derived::SizeAtCompileTime>=16)>
742 struct setIdentity_impl
743 {
744   EIGEN_DEVICE_FUNC
745   static EIGEN_STRONG_INLINE Derived& run(Derived& m)
746   {
747     return m = Derived::Identity(m.rows(), m.cols());
748   }
749 };
750 
751 template<typename Derived>
752 struct setIdentity_impl<Derived, true>
753 {
754   EIGEN_DEVICE_FUNC
755   static EIGEN_STRONG_INLINE Derived& run(Derived& m)
756   {
757     m.setZero();
758     const Index size = numext::mini(m.rows(), m.cols());
759     for(Index i = 0; i < size; ++i) m.coeffRef(i,i) = typename Derived::Scalar(1);
760     return m;
761   }
762 };
763 
764 } // end namespace internal
765 
766 /** Writes the identity expression (not necessarily square) into *this.
767   *
768   * Example: \include MatrixBase_setIdentity.cpp
769   * Output: \verbinclude MatrixBase_setIdentity.out
770   *
771   * \sa class CwiseNullaryOp, Identity(), Identity(Index,Index), isIdentity()
772   */
773 template<typename Derived>
774 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setIdentity()
775 {
776   return internal::setIdentity_impl<Derived>::run(derived());
777 }
778 
779 /** \brief Resizes to the given size, and writes the identity expression (not necessarily square) into *this.
780   *
781   * \param rows the new number of rows
782   * \param cols the new number of columns
783   *
784   * Example: \include Matrix_setIdentity_int_int.cpp
785   * Output: \verbinclude Matrix_setIdentity_int_int.out
786   *
787   * \sa MatrixBase::setIdentity(), class CwiseNullaryOp, MatrixBase::Identity()
788   */
789 template<typename Derived>
790 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setIdentity(Index p_rows, Index p_cols)
791 {
792   derived().resize(p_rows, p_cols);
793   return setIdentity();
794 }
795 
796 /** \returns an expression of the i-th unit (basis) vector.
797   *
798   * \only_for_vectors
799   *
800   * \sa MatrixBase::Unit(Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
801   */
802 template<typename Derived>
803 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::Unit(Index newSize, Index i)
804 {
805   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
806   return BasisReturnType(SquareMatrixType::Identity(newSize,newSize), i);
807 }
808 
809 /** \returns an expression of the i-th unit (basis) vector.
810   *
811   * \only_for_vectors
812   *
813   * This variant is for fixed-size vector only.
814   *
815   * \sa MatrixBase::Unit(Index,Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
816   */
817 template<typename Derived>
818 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::Unit(Index i)
819 {
820   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
821   return BasisReturnType(SquareMatrixType::Identity(),i);
822 }
823 
824 /** \returns an expression of the X axis unit vector (1{,0}^*)
825   *
826   * \only_for_vectors
827   *
828   * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
829   */
830 template<typename Derived>
831 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitX()
832 { return Derived::Unit(0); }
833 
834 /** \returns an expression of the Y axis unit vector (0,1{,0}^*)
835   *
836   * \only_for_vectors
837   *
838   * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
839   */
840 template<typename Derived>
841 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitY()
842 { return Derived::Unit(1); }
843 
844 /** \returns an expression of the Z axis unit vector (0,0,1{,0}^*)
845   *
846   * \only_for_vectors
847   *
848   * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
849   */
850 template<typename Derived>
851 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitZ()
852 { return Derived::Unit(2); }
853 
854 /** \returns an expression of the W axis unit vector (0,0,0,1)
855   *
856   * \only_for_vectors
857   *
858   * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
859   */
860 template<typename Derived>
861 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitW()
862 { return Derived::Unit(3); }
863 
864 } // end namespace Eigen
865 
866 #endif // EIGEN_CWISE_NULLARY_OP_H
867