source: pacpussensors/trunk/Vislab/lib3dv/eigen/Eigen/src/Core/CwiseNullaryOp.h@ 136

Last change on this file since 136 was 136, checked in by ldecherf, 7 years ago

Doc

File size: 28.7 KB
Line 
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
13namespace Eigen {
14
15/** \class CwiseNullaryOp
16 * \ingroup Core_Module
17 *
18 * \brief Generic expression of a matrix where all coefficients are defined by a functor
19 *
20 * \param NullaryOp template functor implementing the operator
21 * \param PlainObjectType the underlying plain matrix/array type
22 *
23 * This class represents an expression of a generic nullary operator.
24 * It is the return type of the Ones(), Zero(), Constant(), Identity() and Random() methods,
25 * and most of the time this is the only way it is used.
26 *
27 * However, if you want to write a function returning such an expression, you
28 * will need to use this class.
29 *
30 * \sa class CwiseUnaryOp, class CwiseBinaryOp, DenseBase::NullaryExpr()
31 */
32
33namespace internal {
34template<typename NullaryOp, typename PlainObjectType>
35struct traits<CwiseNullaryOp<NullaryOp, PlainObjectType> > : traits<PlainObjectType>
36{
37 enum {
38 Flags = (traits<PlainObjectType>::Flags
39 & ( HereditaryBits
40 | (functor_has_linear_access<NullaryOp>::ret ? LinearAccessBit : 0)
41 | (functor_traits<NullaryOp>::PacketAccess ? PacketAccessBit : 0)))
42 | (functor_traits<NullaryOp>::IsRepeatable ? 0 : EvalBeforeNestingBit),
43 CoeffReadCost = functor_traits<NullaryOp>::Cost
44 };
45};
46}
47
48template<typename NullaryOp, typename PlainObjectType>
49class CwiseNullaryOp : internal::no_assignment_operator,
50 public internal::dense_xpr_base< CwiseNullaryOp<NullaryOp, PlainObjectType> >::type
51{
52 public:
53
54 typedef typename internal::dense_xpr_base<CwiseNullaryOp>::type Base;
55 EIGEN_DENSE_PUBLIC_INTERFACE(CwiseNullaryOp)
56
57 CwiseNullaryOp(Index nbRows, Index nbCols, const NullaryOp& func = NullaryOp())
58 : m_rows(nbRows), m_cols(nbCols), m_functor(func)
59 {
60 eigen_assert(nbRows >= 0
61 && (RowsAtCompileTime == Dynamic || RowsAtCompileTime == nbRows)
62 && nbCols >= 0
63 && (ColsAtCompileTime == Dynamic || ColsAtCompileTime == nbCols));
64 }
65
66 EIGEN_STRONG_INLINE Index rows() const { return m_rows.value(); }
67 EIGEN_STRONG_INLINE Index cols() const { return m_cols.value(); }
68
69 EIGEN_STRONG_INLINE const Scalar coeff(Index rowId, Index colId) const
70 {
71 return m_functor(rowId, colId);
72 }
73
74 template<int LoadMode>
75 EIGEN_STRONG_INLINE PacketScalar packet(Index rowId, Index colId) const
76 {
77 return m_functor.packetOp(rowId, colId);
78 }
79
80 EIGEN_STRONG_INLINE const Scalar coeff(Index index) const
81 {
82 return m_functor(index);
83 }
84
85 template<int LoadMode>
86 EIGEN_STRONG_INLINE PacketScalar packet(Index index) const
87 {
88 return m_functor.packetOp(index);
89 }
90
91 /** \returns the functor representing the nullary operation */
92 const NullaryOp& functor() const { return m_functor; }
93
94 protected:
95 const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_rows;
96 const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_cols;
97 const NullaryOp m_functor;
98};
99
100
101/** \returns an expression of a matrix defined by a custom functor \a func
102 *
103 * The parameters \a rows and \a cols are the number of rows and of columns of
104 * the returned matrix. Must be compatible with this MatrixBase type.
105 *
106 * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
107 * it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used
108 * instead.
109 *
110 * The template parameter \a CustomNullaryOp is the type of the functor.
111 *
112 * \sa class CwiseNullaryOp
113 */
114template<typename Derived>
115template<typename CustomNullaryOp>
116EIGEN_STRONG_INLINE const CwiseNullaryOp<CustomNullaryOp, Derived>
117DenseBase<Derived>::NullaryExpr(Index rows, Index cols, const CustomNullaryOp& func)
118{
119 return CwiseNullaryOp<CustomNullaryOp, Derived>(rows, cols, func);
120}
121
122/** \returns an expression of a matrix defined by a custom functor \a func
123 *
124 * The parameter \a size is the size of the returned vector.
125 * Must be compatible with this MatrixBase type.
126 *
127 * \only_for_vectors
128 *
129 * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
130 * it is redundant to pass \a size as argument, so Zero() should be used
131 * instead.
132 *
133 * The template parameter \a CustomNullaryOp is the type of the functor.
134 *
135 * \sa class CwiseNullaryOp
136 */
137template<typename Derived>
138template<typename CustomNullaryOp>
139EIGEN_STRONG_INLINE const CwiseNullaryOp<CustomNullaryOp, Derived>
140DenseBase<Derived>::NullaryExpr(Index size, const CustomNullaryOp& func)
141{
142 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
143 if(RowsAtCompileTime == 1) return CwiseNullaryOp<CustomNullaryOp, Derived>(1, size, func);
144 else return CwiseNullaryOp<CustomNullaryOp, Derived>(size, 1, func);
145}
146
147/** \returns an expression of a matrix defined by a custom functor \a func
148 *
149 * This variant is only for fixed-size DenseBase types. For dynamic-size types, you
150 * need to use the variants taking size arguments.
151 *
152 * The template parameter \a CustomNullaryOp is the type of the functor.
153 *
154 * \sa class CwiseNullaryOp
155 */
156template<typename Derived>
157template<typename CustomNullaryOp>
158EIGEN_STRONG_INLINE const CwiseNullaryOp<CustomNullaryOp, Derived>
159DenseBase<Derived>::NullaryExpr(const CustomNullaryOp& func)
160{
161 return CwiseNullaryOp<CustomNullaryOp, Derived>(RowsAtCompileTime, ColsAtCompileTime, func);
162}
163
164/** \returns an expression of a constant matrix of value \a value
165 *
166 * The parameters \a nbRows and \a nbCols are the number of rows and of columns of
167 * the returned matrix. Must be compatible with this DenseBase type.
168 *
169 * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
170 * it is redundant to pass \a nbRows and \a nbCols as arguments, so Zero() should be used
171 * instead.
172 *
173 * The template parameter \a CustomNullaryOp is the type of the functor.
174 *
175 * \sa class CwiseNullaryOp
176 */
177template<typename Derived>
178EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
179DenseBase<Derived>::Constant(Index nbRows, Index nbCols, const Scalar& value)
180{
181 return DenseBase<Derived>::NullaryExpr(nbRows, nbCols, internal::scalar_constant_op<Scalar>(value));
182}
183
184/** \returns an expression of a constant matrix of value \a value
185 *
186 * The parameter \a size is the size of the returned vector.
187 * Must be compatible with this DenseBase type.
188 *
189 * \only_for_vectors
190 *
191 * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
192 * it is redundant to pass \a size as argument, so Zero() should be used
193 * instead.
194 *
195 * The template parameter \a CustomNullaryOp is the type of the functor.
196 *
197 * \sa class CwiseNullaryOp
198 */
199template<typename Derived>
200EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
201DenseBase<Derived>::Constant(Index size, const Scalar& value)
202{
203 return DenseBase<Derived>::NullaryExpr(size, internal::scalar_constant_op<Scalar>(value));
204}
205
206/** \returns an expression of a constant matrix of value \a value
207 *
208 * This variant is only for fixed-size DenseBase types. For dynamic-size types, you
209 * need to use the variants taking size arguments.
210 *
211 * The template parameter \a CustomNullaryOp is the type of the functor.
212 *
213 * \sa class CwiseNullaryOp
214 */
215template<typename Derived>
216EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
217DenseBase<Derived>::Constant(const Scalar& value)
218{
219 EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
220 return DenseBase<Derived>::NullaryExpr(RowsAtCompileTime, ColsAtCompileTime, internal::scalar_constant_op<Scalar>(value));
221}
222
223/**
224 * \brief Sets a linearly space vector.
225 *
226 * The function generates 'size' equally spaced values in the closed interval [low,high].
227 * This particular version of LinSpaced() uses sequential access, i.e. vector access is
228 * assumed to be a(0), a(1), ..., a(size). This assumption allows for better vectorization
229 * and yields faster code than the random access version.
230 *
231 * When size is set to 1, a vector of length 1 containing 'high' is returned.
232 *
233 * \only_for_vectors
234 *
235 * Example: \include DenseBase_LinSpaced_seq.cpp
236 * Output: \verbinclude DenseBase_LinSpaced_seq.out
237 *
238 * \sa setLinSpaced(Index,const Scalar&,const Scalar&), LinSpaced(Index,Scalar,Scalar), CwiseNullaryOp
239 */
240template<typename Derived>
241EIGEN_STRONG_INLINE const typename DenseBase<Derived>::SequentialLinSpacedReturnType
242DenseBase<Derived>::LinSpaced(Sequential_t, Index size, const Scalar& low, const Scalar& high)
243{
244 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
245 return DenseBase<Derived>::NullaryExpr(size, internal::linspaced_op<Scalar,false>(low,high,size));
246}
247
248/**
249 * \copydoc DenseBase::LinSpaced(Sequential_t, Index, const Scalar&, const Scalar&)
250 * Special version for fixed size types which does not require the size parameter.
251 */
252template<typename Derived>
253EIGEN_STRONG_INLINE const typename DenseBase<Derived>::SequentialLinSpacedReturnType
254DenseBase<Derived>::LinSpaced(Sequential_t, const Scalar& low, const Scalar& high)
255{
256 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
257 EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
258 return DenseBase<Derived>::NullaryExpr(Derived::SizeAtCompileTime, internal::linspaced_op<Scalar,false>(low,high,Derived::SizeAtCompileTime));
259}
260
261/**
262 * \brief Sets a linearly space vector.
263 *
264 * The function generates 'size' equally spaced values in the closed interval [low,high].
265 * When size is set to 1, a vector of length 1 containing 'high' is returned.
266 *
267 * \only_for_vectors
268 *
269 * Example: \include DenseBase_LinSpaced.cpp
270 * Output: \verbinclude DenseBase_LinSpaced.out
271 *
272 * \sa setLinSpaced(Index,const Scalar&,const Scalar&), LinSpaced(Sequential_t,Index,const Scalar&,const Scalar&,Index), CwiseNullaryOp
273 */
274template<typename Derived>
275EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
276DenseBase<Derived>::LinSpaced(Index size, const Scalar& low, const Scalar& high)
277{
278 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
279 return DenseBase<Derived>::NullaryExpr(size, internal::linspaced_op<Scalar,true>(low,high,size));
280}
281
282/**
283 * \copydoc DenseBase::LinSpaced(Index, const Scalar&, const Scalar&)
284 * Special version for fixed size types which does not require the size parameter.
285 */
286template<typename Derived>
287EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
288DenseBase<Derived>::LinSpaced(const Scalar& low, const Scalar& high)
289{
290 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
291 EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
292 return DenseBase<Derived>::NullaryExpr(Derived::SizeAtCompileTime, internal::linspaced_op<Scalar,true>(low,high,Derived::SizeAtCompileTime));
293}
294
295/** \returns true if all coefficients in this matrix are approximately equal to \a val, to within precision \a prec */
296template<typename Derived>
297bool DenseBase<Derived>::isApproxToConstant
298(const Scalar& val, const RealScalar& prec) const
299{
300 for(Index j = 0; j < cols(); ++j)
301 for(Index i = 0; i < rows(); ++i)
302 if(!internal::isApprox(this->coeff(i, j), val, prec))
303 return false;
304 return true;
305}
306
307/** This is just an alias for isApproxToConstant().
308 *
309 * \returns true if all coefficients in this matrix are approximately equal to \a value, to within precision \a prec */
310template<typename Derived>
311bool DenseBase<Derived>::isConstant
312(const Scalar& val, const RealScalar& prec) const
313{
314 return isApproxToConstant(val, prec);
315}
316
317/** Alias for setConstant(): sets all coefficients in this expression to \a val.
318 *
319 * \sa setConstant(), Constant(), class CwiseNullaryOp
320 */
321template<typename Derived>
322EIGEN_STRONG_INLINE void DenseBase<Derived>::fill(const Scalar& val)
323{
324 setConstant(val);
325}
326
327/** Sets all coefficients in this expression to \a value.
328 *
329 * \sa fill(), setConstant(Index,const Scalar&), setConstant(Index,Index,const Scalar&), setZero(), setOnes(), Constant(), class CwiseNullaryOp, setZero(), setOnes()
330 */
331template<typename Derived>
332EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setConstant(const Scalar& val)
333{
334 return derived() = Constant(rows(), cols(), val);
335}
336
337/** Resizes to the given \a size, and sets all coefficients in this expression to the given \a value.
338 *
339 * \only_for_vectors
340 *
341 * Example: \include Matrix_setConstant_int.cpp
342 * Output: \verbinclude Matrix_setConstant_int.out
343 *
344 * \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&)
345 */
346template<typename Derived>
347EIGEN_STRONG_INLINE Derived&
348PlainObjectBase<Derived>::setConstant(Index size, const Scalar& val)
349{
350 resize(size);
351 return setConstant(val);
352}
353
354/** Resizes to the given size, and sets all coefficients in this expression to the given \a value.
355 *
356 * \param nbRows the new number of rows
357 * \param nbCols the new number of columns
358 * \param val the value to which all coefficients are set
359 *
360 * Example: \include Matrix_setConstant_int_int.cpp
361 * Output: \verbinclude Matrix_setConstant_int_int.out
362 *
363 * \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&)
364 */
365template<typename Derived>
366EIGEN_STRONG_INLINE Derived&
367PlainObjectBase<Derived>::setConstant(Index nbRows, Index nbCols, const Scalar& val)
368{
369 resize(nbRows, nbCols);
370 return setConstant(val);
371}
372
373/**
374 * \brief Sets a linearly space vector.
375 *
376 * The function generates 'size' equally spaced values in the closed interval [low,high].
377 * When size is set to 1, a vector of length 1 containing 'high' is returned.
378 *
379 * \only_for_vectors
380 *
381 * Example: \include DenseBase_setLinSpaced.cpp
382 * Output: \verbinclude DenseBase_setLinSpaced.out
383 *
384 * \sa CwiseNullaryOp
385 */
386template<typename Derived>
387EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setLinSpaced(Index newSize, const Scalar& low, const Scalar& high)
388{
389 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
390 return derived() = Derived::NullaryExpr(newSize, internal::linspaced_op<Scalar,false>(low,high,newSize));
391}
392
393/**
394 * \brief Sets a linearly space vector.
395 *
396 * The function fill *this with equally spaced values in the closed interval [low,high].
397 * When size is set to 1, a vector of length 1 containing 'high' is returned.
398 *
399 * \only_for_vectors
400 *
401 * \sa setLinSpaced(Index, const Scalar&, const Scalar&), CwiseNullaryOp
402 */
403template<typename Derived>
404EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setLinSpaced(const Scalar& low, const Scalar& high)
405{
406 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
407 return setLinSpaced(size(), low, high);
408}
409
410// zero:
411
412/** \returns an expression of a zero matrix.
413 *
414 * The parameters \a rows and \a cols are the number of rows and of columns of
415 * the returned matrix. Must be compatible with this MatrixBase type.
416 *
417 * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
418 * it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used
419 * instead.
420 *
421 * Example: \include MatrixBase_zero_int_int.cpp
422 * Output: \verbinclude MatrixBase_zero_int_int.out
423 *
424 * \sa Zero(), Zero(Index)
425 */
426template<typename Derived>
427EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
428DenseBase<Derived>::Zero(Index nbRows, Index nbCols)
429{
430 return Constant(nbRows, nbCols, Scalar(0));
431}
432
433/** \returns an expression of a zero vector.
434 *
435 * The parameter \a size is the size of the returned vector.
436 * Must be compatible with this MatrixBase type.
437 *
438 * \only_for_vectors
439 *
440 * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
441 * it is redundant to pass \a size as argument, so Zero() should be used
442 * instead.
443 *
444 * Example: \include MatrixBase_zero_int.cpp
445 * Output: \verbinclude MatrixBase_zero_int.out
446 *
447 * \sa Zero(), Zero(Index,Index)
448 */
449template<typename Derived>
450EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
451DenseBase<Derived>::Zero(Index size)
452{
453 return Constant(size, Scalar(0));
454}
455
456/** \returns an expression of a fixed-size zero matrix or vector.
457 *
458 * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you
459 * need to use the variants taking size arguments.
460 *
461 * Example: \include MatrixBase_zero.cpp
462 * Output: \verbinclude MatrixBase_zero.out
463 *
464 * \sa Zero(Index), Zero(Index,Index)
465 */
466template<typename Derived>
467EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
468DenseBase<Derived>::Zero()
469{
470 return Constant(Scalar(0));
471}
472
473/** \returns true if *this is approximately equal to the zero matrix,
474 * within the precision given by \a prec.
475 *
476 * Example: \include MatrixBase_isZero.cpp
477 * Output: \verbinclude MatrixBase_isZero.out
478 *
479 * \sa class CwiseNullaryOp, Zero()
480 */
481template<typename Derived>
482bool DenseBase<Derived>::isZero(const RealScalar& prec) const
483{
484 for(Index j = 0; j < cols(); ++j)
485 for(Index i = 0; i < rows(); ++i)
486 if(!internal::isMuchSmallerThan(this->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 */
498template<typename Derived>
499EIGEN_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 */
513template<typename Derived>
514EIGEN_STRONG_INLINE Derived&
515PlainObjectBase<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 nbRows the new number of rows
524 * \param nbCols 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 */
531template<typename Derived>
532EIGEN_STRONG_INLINE Derived&
533PlainObjectBase<Derived>::setZero(Index nbRows, Index nbCols)
534{
535 resize(nbRows, nbCols);
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 nbRows and \a nbCols 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 */
555template<typename Derived>
556EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
557DenseBase<Derived>::Ones(Index nbRows, Index nbCols)
558{
559 return Constant(nbRows, nbCols, 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 */
578template<typename Derived>
579EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
580DenseBase<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 */
595template<typename Derived>
596EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
597DenseBase<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 */
610template<typename Derived>
611bool 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 */
624template<typename Derived>
625EIGEN_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 */
639template<typename Derived>
640EIGEN_STRONG_INLINE Derived&
641PlainObjectBase<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 nbRows the new number of rows
650 * \param nbCols 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 */
657template<typename Derived>
658EIGEN_STRONG_INLINE Derived&
659PlainObjectBase<Derived>::setOnes(Index nbRows, Index nbCols)
660{
661 resize(nbRows, nbCols);
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 nbRows and \a nbCols 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 */
681template<typename Derived>
682EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::IdentityReturnType
683MatrixBase<Derived>::Identity(Index nbRows, Index nbCols)
684{
685 return DenseBase<Derived>::NullaryExpr(nbRows, nbCols, 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 */
698template<typename Derived>
699EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::IdentityReturnType
700MatrixBase<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 */
715template<typename Derived>
716bool MatrixBase<Derived>::isIdentity
717(const RealScalar& prec) const
718{
719 for(Index j = 0; j < cols(); ++j)
720 {
721 for(Index i = 0; i < rows(); ++i)
722 {
723 if(i == j)
724 {
725 if(!internal::isApprox(this->coeff(i, j), static_cast<Scalar>(1), prec))
726 return false;
727 }
728 else
729 {
730 if(!internal::isMuchSmallerThan(this->coeff(i, j), static_cast<RealScalar>(1), prec))
731 return false;
732 }
733 }
734 }
735 return true;
736}
737
738namespace internal {
739
740template<typename Derived, bool Big = (Derived::SizeAtCompileTime>=16)>
741struct setIdentity_impl
742{
743 static EIGEN_STRONG_INLINE Derived& run(Derived& m)
744 {
745 return m = Derived::Identity(m.rows(), m.cols());
746 }
747};
748
749template<typename Derived>
750struct setIdentity_impl<Derived, true>
751{
752 typedef typename Derived::Index Index;
753 static EIGEN_STRONG_INLINE Derived& run(Derived& m)
754 {
755 m.setZero();
756 const Index size = (std::min)(m.rows(), m.cols());
757 for(Index i = 0; i < size; ++i) m.coeffRef(i,i) = typename Derived::Scalar(1);
758 return m;
759 }
760};
761
762} // end namespace internal
763
764/** Writes the identity expression (not necessarily square) into *this.
765 *
766 * Example: \include MatrixBase_setIdentity.cpp
767 * Output: \verbinclude MatrixBase_setIdentity.out
768 *
769 * \sa class CwiseNullaryOp, Identity(), Identity(Index,Index), isIdentity()
770 */
771template<typename Derived>
772EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setIdentity()
773{
774 return internal::setIdentity_impl<Derived>::run(derived());
775}
776
777/** \brief Resizes to the given size, and writes the identity expression (not necessarily square) into *this.
778 *
779 * \param nbRows the new number of rows
780 * \param nbCols the new number of columns
781 *
782 * Example: \include Matrix_setIdentity_int_int.cpp
783 * Output: \verbinclude Matrix_setIdentity_int_int.out
784 *
785 * \sa MatrixBase::setIdentity(), class CwiseNullaryOp, MatrixBase::Identity()
786 */
787template<typename Derived>
788EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setIdentity(Index nbRows, Index nbCols)
789{
790 derived().resize(nbRows, nbCols);
791 return setIdentity();
792}
793
794/** \returns an expression of the i-th unit (basis) vector.
795 *
796 * \only_for_vectors
797 *
798 * \sa MatrixBase::Unit(Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
799 */
800template<typename Derived>
801EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::Unit(Index newSize, Index i)
802{
803 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
804 return BasisReturnType(SquareMatrixType::Identity(newSize,newSize), i);
805}
806
807/** \returns an expression of the i-th unit (basis) vector.
808 *
809 * \only_for_vectors
810 *
811 * This variant is for fixed-size vector only.
812 *
813 * \sa MatrixBase::Unit(Index,Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
814 */
815template<typename Derived>
816EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::Unit(Index i)
817{
818 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
819 return BasisReturnType(SquareMatrixType::Identity(),i);
820}
821
822/** \returns an expression of the X axis unit vector (1{,0}^*)
823 *
824 * \only_for_vectors
825 *
826 * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
827 */
828template<typename Derived>
829EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitX()
830{ return Derived::Unit(0); }
831
832/** \returns an expression of the Y axis unit vector (0,1{,0}^*)
833 *
834 * \only_for_vectors
835 *
836 * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
837 */
838template<typename Derived>
839EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitY()
840{ return Derived::Unit(1); }
841
842/** \returns an expression of the Z axis unit vector (0,0,1{,0}^*)
843 *
844 * \only_for_vectors
845 *
846 * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
847 */
848template<typename Derived>
849EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitZ()
850{ return Derived::Unit(2); }
851
852/** \returns an expression of the W axis unit vector (0,0,0,1)
853 *
854 * \only_for_vectors
855 *
856 * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
857 */
858template<typename Derived>
859EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitW()
860{ return Derived::Unit(3); }
861
862} // end namespace Eigen
863
864#endif // EIGEN_CWISE_NULLARY_OP_H
Note: See TracBrowser for help on using the repository browser.