WPILibC++ 2023.4.3
CwiseNullaryOp.h
Go to the documentation of this file.
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
15namespace internal {
16template<typename NullaryOp, typename PlainObjectType>
17struct traits<CwiseNullaryOp<NullaryOp, PlainObjectType> > : traits<PlainObjectType>
18{
19 enum {
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 */
59template<typename NullaryOp, typename PlainObjectType>
60class CwiseNullaryOp : public internal::dense_xpr_base< CwiseNullaryOp<NullaryOp, PlainObjectType> >::type, internal::no_assignment_operator
61{
62 public:
63
66
68 CwiseNullaryOp(Index rows, Index cols, const NullaryOp& func = NullaryOp())
69 : m_rows(rows), m_cols(cols), m_functor(func)
70 {
72 && (RowsAtCompileTime == Dynamic || RowsAtCompileTime == rows)
73 && cols >= 0
74 && (ColsAtCompileTime == Dynamic || ColsAtCompileTime == cols));
75 }
76
78 Index rows() const { return m_rows.value(); }
80 Index cols() const { return m_cols.value(); }
81
82 /** \returns the functor representing the nullary operation */
84 const NullaryOp& functor() const { return m_functor; }
85
86 protected:
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 */
106template<typename Derived>
107template<typename CustomNullaryOp>
109#ifndef EIGEN_PARSED_BY_DOXYGEN
111#else
113#endif
114DenseBase<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 */
137template<typename Derived>
138template<typename CustomNullaryOp>
140#ifndef EIGEN_PARSED_BY_DOXYGEN
142#else
144#endif
145DenseBase<Derived>::NullaryExpr(Index size, const CustomNullaryOp& func)
146{
148 if(RowsAtCompileTime == 1) return CwiseNullaryOp<CustomNullaryOp, PlainObject>(1, size, 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 */
161template<typename Derived>
162template<typename CustomNullaryOp>
164#ifndef EIGEN_PARSED_BY_DOXYGEN
166#else
168#endif
169DenseBase<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 */
187template<typename Derived>
190{
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 */
209template<typename Derived>
212{
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 */
225template<typename Derived>
228{
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 */
242template<typename Derived>
245{
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 */
254template<typename Derived>
260 return DenseBase<Derived>::NullaryExpr(Derived::SizeAtCompileTime, internal::linspaced_op<Scalar>(low,high,Derived::SizeAtCompileTime));
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.
269 * \only_for_vectors
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 */
286template<typename Derived>
288DenseBase<Derived>::LinSpaced(Index size, const Scalar& low, const Scalar& high)
289{
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 */
298template<typename Derived>
301{
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 */
308template<typename Derived>
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 */
323template<typename Derived>
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 */
334template<typename Derived>
337 setConstant(val);
339
340/** Sets all coefficients in this expression to value \a val.
342 * \sa fill(), setConstant(Index,const Scalar&), setConstant(Index,Index,const Scalar&), setZero(), setOnes(), Constant(), class CwiseNullaryOp, setZero(), setOnes()
343 */
344template<typename Derived>
347 return derived() = Constant(rows(), cols(), val);
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 */
359template<typename Derived>
363 resize(size);
364 return setConstant(val);
366
367/** Resizes to the given size, and sets all coefficients in this expression to the given value \a val.
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
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 */
378template<typename Derived>
381{
382 resize(rows, cols);
383 return setConstant(val);
384}
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 */
392template<typename Derived>
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 */
405template<typename Derived>
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 */
429template<typename Derived>
431{
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 */
449template<typename Derived>
451{
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 */
472template<typename Derived>
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 */
495template<typename Derived>
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 */
512template<typename Derived>
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 */
527template<typename Derived>
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 */
545template<typename Derived>
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 */
560template<typename Derived>
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 */
578template<typename Derived>
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 */
592template<typename Derived>
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 */
605template<typename Derived>
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 */
628template<typename Derived>
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 */
651template<typename Derived>
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 */
668template<typename Derived>
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 */
683template<typename Derived>
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 */
697template<typename Derived>
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 */
712template<typename Derived>
715{
716 resize(newSize);
717 return setConstant(Scalar(1));
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
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 */
730template<typename Derived>
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 */
744template<typename Derived>
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 */
757template<typename Derived>
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 */
780template<typename Derived>
783{
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 */
797template<typename Derived>
800{
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 */
814template<typename Derived>
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
838namespace internal {
839
840template<typename Derived, bool Big = (Derived::SizeAtCompileTime>=16)>
842{
844 static EIGEN_STRONG_INLINE Derived& run(Derived& m)
845 {
846 return m = Derived::Identity(m.rows(), m.cols());
847 }
848};
849
850template<typename Derived>
851struct setIdentity_impl<Derived, true>
852{
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 */
872template<typename Derived>
874{
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 */
888template<typename Derived>
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 */
901template<typename Derived>
903{
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 */
916template<typename Derived>
918{
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 */
929template<typename Derived>
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 */
939template<typename Derived>
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 */
949template<typename Derived>
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 */
959template<typename Derived>
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 */
971template<typename Derived>
973{
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 */
990template<typename Derived>
992{
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
#define EIGEN_DEPRECATED
Definition: Macros.h:1068
#define EIGEN_CONSTEXPR
Definition: Macros.h:797
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:986
#define EIGEN_DENSE_PUBLIC_INTERFACE(Derived)
Definition: Macros.h:1293
#define eigen_assert(x)
Definition: Macros.h:1047
#define EIGEN_STRONG_INLINE
Definition: Macros.h:927
#define EIGEN_STATIC_ASSERT_FIXED_SIZE(TYPE)
Definition: StaticAssert.h:147
#define EIGEN_STATIC_ASSERT_VECTOR_ONLY(TYPE)
Definition: StaticAssert.h:142
Expression of a fixed-size or dynamic-size block.
Definition: Block.h:105
Generic expression of a matrix where all coefficients are defined by a functor.
Definition: CwiseNullaryOp.h:61
EIGEN_DEVICE_FUNC CwiseNullaryOp(Index rows, Index cols, const NullaryOp &func=NullaryOp())
Definition: CwiseNullaryOp.h:68
const internal::variable_if_dynamic< Index, ColsAtCompileTime > m_cols
Definition: CwiseNullaryOp.h:88
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index rows() const
Definition: CwiseNullaryOp.h:78
const internal::variable_if_dynamic< Index, RowsAtCompileTime > m_rows
Definition: CwiseNullaryOp.h:87
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index cols() const
Definition: CwiseNullaryOp.h:80
EIGEN_DEVICE_FUNC const NullaryOp & functor() const
Definition: CwiseNullaryOp.h:84
const NullaryOp m_functor
Definition: CwiseNullaryOp.h:89
internal::dense_xpr_base< CwiseNullaryOp >::type Base
Definition: CwiseNullaryOp.h:64
Base class for all dense matrices, vectors, and arrays.
Definition: DenseBase.h:47
static EIGEN_DEVICE_FUNC const ConstantReturnType Constant(Index rows, Index cols, const Scalar &value)
Definition: CwiseNullaryOp.h:189
static EIGEN_DEVICE_FUNC const ConstantReturnType Ones()
Definition: CwiseNullaryOp.h:670
EIGEN_DEVICE_FUNC Derived & setLinSpaced(Index size, const Scalar &low, const Scalar &high)
Sets a linearly spaced vector.
Definition: CwiseNullaryOp.h:430
EIGEN_DEVICE_FUNC Derived & setConstant(const Scalar &value)
Sets all coefficients in this expression to value val.
Definition: CwiseNullaryOp.h:345
NumTraits< Scalar >::Real RealScalar
Definition: DenseBase.h:73
EIGEN_DEVICE_FUNC void fill(const Scalar &value)
Alias for setConstant(): sets all coefficients in this expression to val.
Definition: CwiseNullaryOp.h:335
internal::traits< Derived >::Scalar Scalar
The numeric type of the expression' coefficients, e.g.
Definition: DenseBase.h:66
EIGEN_DEPRECATED static EIGEN_DEVICE_FUNC const RandomAccessLinSpacedReturnType LinSpaced(Sequential_t, Index size, const Scalar &low, const Scalar &high)
Definition: CwiseNullaryOp.h:244
static EIGEN_DEVICE_FUNC const ConstantReturnType Zero()
Definition: CwiseNullaryOp.h:514
EIGEN_DEVICE_FUNC bool isOnes(const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition: CwiseNullaryOp.h:685
EIGEN_DEVICE_FUNC bool isZero(const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition: CwiseNullaryOp.h:528
EIGEN_DEVICE_FUNC bool isApproxToConstant(const Scalar &value, const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition: CwiseNullaryOp.h:310
EIGEN_DEVICE_FUNC bool isConstant(const Scalar &value, const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
This is just an alias for isApproxToConstant().
Definition: CwiseNullaryOp.h:325
static EIGEN_DEVICE_FUNC const CwiseNullaryOp< CustomNullaryOp, PlainObject > NullaryExpr(Index rows, Index cols, const CustomNullaryOp &func)
EIGEN_DEVICE_FUNC Derived & setZero()
Sets all coefficients in this expression to zero.
Definition: CwiseNullaryOp.h:546
EIGEN_DEVICE_FUNC Derived & setOnes()
Sets all coefficients in this expression to one.
Definition: CwiseNullaryOp.h:698
static EIGEN_DEVICE_FUNC const BasisReturnType UnitZ()
Definition: CwiseNullaryOp.h:950
static EIGEN_DEVICE_FUNC const BasisReturnType Unit(Index size, Index i)
Definition: CwiseNullaryOp.h:902
static EIGEN_DEVICE_FUNC const IdentityReturnType Identity()
Definition: CwiseNullaryOp.h:799
bool isIdentity(const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition: CwiseNullaryOp.h:816
static EIGEN_DEVICE_FUNC const BasisReturnType UnitY()
Definition: CwiseNullaryOp.h:940
static EIGEN_DEVICE_FUNC const BasisReturnType UnitX()
Definition: CwiseNullaryOp.h:930
static EIGEN_DEVICE_FUNC const BasisReturnType UnitW()
Definition: CwiseNullaryOp.h:960
EIGEN_DEVICE_FUNC Derived & setIdentity()
Writes the identity expression (not necessarily square) into *this.
Definition: CwiseNullaryOp.h:873
EIGEN_DEVICE_FUNC Derived & setUnit(Index i)
Set the coefficients of *this to the i-th unit (basis) vector.
Definition: CwiseNullaryOp.h:972
EIGEN_DEVICE_FUNC Derived & setOnes(Index size)
Resizes to the given newSize, and sets all coefficients in this expression to one.
Definition: CwiseNullaryOp.h:714
internal::traits< Derived >::Scalar Scalar
Definition: PlainObjectBase.h:106
EIGEN_DEVICE_FUNC Derived & setZero(Index size)
Resizes to the given size, and sets all coefficients in this expression to zero.
Definition: CwiseNullaryOp.h:562
EIGEN_DEVICE_FUNC Derived & setConstant(Index size, const Scalar &val)
Resizes to the given size, and sets all coefficients in this expression to the given value val.
Definition: CwiseNullaryOp.h:361
Definition: XprHelper.h:110
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR T value()
Definition: XprHelper.h:135
Definition: core.h:1240
type
Definition: core.h:575
const unsigned int RowMajorBit
for a matrix, this means that the storage order is row-major.
Definition: Constants.h:66
EIGEN_DEVICE_FUNC bool isApprox(const Scalar &x, const Scalar &y, const typename NumTraits< Scalar >::Real &precision=NumTraits< Scalar >::dummy_precision())
Definition: MathFunctions.h:1947
EIGEN_DEVICE_FUNC bool isMuchSmallerThan(const Scalar &x, const OtherScalar &y, const typename NumTraits< Scalar >::Real &precision=NumTraits< Scalar >::dummy_precision())
Definition: MathFunctions.h:1940
EIGEN_CONSTEXPR Index size(const T &x)
Definition: Meta.h:479
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T mini(const T &x, const T &y)
Definition: MathFunctions.h:1083
Namespace containing all symbols from the Eigen library.
Definition: MatrixExponential.h:16
NoChange_t
Definition: Constants.h:360
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74
Sequential_t
Definition: Constants.h:361
const int Dynamic
This value means that a positive quantity (e.g., a size) is not known at compile-time,...
Definition: Constants.h:22
Definition: Eigen_Colamd.h:50
Definition: XprHelper.h:484
Definition: NullaryFunctors.h:131
Definition: NullaryFunctors.h:18
Definition: NullaryFunctors.h:31
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived & run(Derived &m)
Definition: CwiseNullaryOp.h:854
Definition: CwiseNullaryOp.h:842
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived & run(Derived &m)
Definition: CwiseNullaryOp.h:844
Definition: ForwardDeclarations.h:17
Definition: Meta.h:96