$darkmode
Eigen  5.0.1-dev
DenseBase.h
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2007-2010 Benoit Jacob <jacob.benoit.1@gmail.com>
5 // Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
6 //
7 // This Source Code Form is subject to the terms of the Mozilla
8 // Public License v. 2.0. If a copy of the MPL was not distributed
9 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10 
11 #ifndef EIGEN_DENSEBASE_H
12 #define EIGEN_DENSEBASE_H
13 
14 // IWYU pragma: private
15 #include "./InternalHeaderCheck.h"
16 
17 namespace Eigen {
18 
19 // The index type defined by EIGEN_DEFAULT_DENSE_INDEX_TYPE must be a signed type.
20 EIGEN_STATIC_ASSERT(NumTraits<DenseIndex>::IsSigned, THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE)
21 
22 
37 template <typename Derived>
38 class DenseBase
39 #ifndef EIGEN_PARSED_BY_DOXYGEN
40  : public DenseCoeffsBase<Derived, internal::accessors_level<Derived>::value>
41 #else
42  : public DenseCoeffsBase<Derived, DirectWriteAccessors>
43 #endif // not EIGEN_PARSED_BY_DOXYGEN
44 {
45  public:
50 
51  typedef typename internal::traits<Derived>::StorageKind StorageKind;
52 
59  typedef typename internal::traits<Derived>::StorageIndex StorageIndex;
60 
62  typedef typename internal::traits<Derived>::Scalar Scalar;
63 
67  typedef Scalar value_type;
68 
69  typedef typename NumTraits<Scalar>::Real RealScalar;
70  typedef DenseCoeffsBase<Derived, internal::accessors_level<Derived>::value> Base;
71 
72  using Base::coeff;
73  using Base::coeffByOuterInner;
74  using Base::colIndexByOuterInner;
75  using Base::cols;
76  using Base::const_cast_derived;
77  using Base::derived;
78  using Base::rowIndexByOuterInner;
79  using Base::rows;
80  using Base::size;
81  using Base::operator();
82  using Base::operator[];
83  using Base::colStride;
84  using Base::innerStride;
85  using Base::outerStride;
86  using Base::rowStride;
87  using Base::stride;
88  using Base::w;
89  using Base::x;
90  using Base::y;
91  using Base::z;
92  typedef typename Base::CoeffReturnType CoeffReturnType;
93 
94  enum {
95 
96  RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
102  ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
108  SizeAtCompileTime = (internal::size_of_xpr_at_compile_time<Derived>::ret),
113  MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,
124  MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime,
135  MaxSizeAtCompileTime = internal::size_at_compile_time(internal::traits<Derived>::MaxRowsAtCompileTime,
136  internal::traits<Derived>::MaxColsAtCompileTime),
148  internal::traits<Derived>::RowsAtCompileTime == 1 || internal::traits<Derived>::ColsAtCompileTime == 1,
155  : bool(IsVectorAtCompileTime) ? 1
156  : 2,
161  Flags = internal::traits<Derived>::Flags,
168  InnerSizeAtCompileTime = int(IsVectorAtCompileTime) ? int(SizeAtCompileTime)
169  : int(IsRowMajor) ? int(ColsAtCompileTime)
170  : int(RowsAtCompileTime),
171 
172  InnerStrideAtCompileTime = internal::inner_stride_at_compile_time<Derived>::ret,
173  OuterStrideAtCompileTime = internal::outer_stride_at_compile_time<Derived>::ret
174  };
175 
176  typedef typename internal::find_best_packet<Scalar, SizeAtCompileTime>::type PacketScalar;
177 
178  enum { IsPlainObjectBase = 0 };
179 
182  typedef Matrix<typename internal::traits<Derived>::Scalar, internal::traits<Derived>::RowsAtCompileTime,
183  internal::traits<Derived>::ColsAtCompileTime,
184  AutoAlign | (internal::traits<Derived>::Flags & RowMajorBit ? RowMajor : ColMajor),
185  internal::traits<Derived>::MaxRowsAtCompileTime, internal::traits<Derived>::MaxColsAtCompileTime>
187 
190  typedef Array<typename internal::traits<Derived>::Scalar, internal::traits<Derived>::RowsAtCompileTime,
191  internal::traits<Derived>::ColsAtCompileTime,
192  AutoAlign | (internal::traits<Derived>::Flags & RowMajorBit ? RowMajor : ColMajor),
193  internal::traits<Derived>::MaxRowsAtCompileTime, internal::traits<Derived>::MaxColsAtCompileTime>
195 
202  typedef std::conditional_t<internal::is_same<typename internal::traits<Derived>::XprKind, MatrixXpr>::value,
205 
211  EIGEN_DEVICE_FUNC constexpr Index outerSize() const {
212  return IsVectorAtCompileTime ? 1 : int(IsRowMajor) ? this->rows() : this->cols();
213  }
214 
220  EIGEN_DEVICE_FUNC constexpr Index innerSize() const {
221  return IsVectorAtCompileTime ? this->size() : int(IsRowMajor) ? this->cols() : this->rows();
222  }
228  EIGEN_DEVICE_FUNC void resize(Index newSize) {
229  EIGEN_ONLY_USED_FOR_DEBUG(newSize);
230  eigen_assert(newSize == this->size() && "DenseBase::resize() does not actually allow to resize.");
231  }
236  EIGEN_DEVICE_FUNC void resize(Index rows, Index cols) {
237  EIGEN_ONLY_USED_FOR_DEBUG(rows);
238  EIGEN_ONLY_USED_FOR_DEBUG(cols);
239  eigen_assert(rows == this->rows() && cols == this->cols() &&
240  "DenseBase::resize() does not actually allow to resize.");
241  }
242 
243 #ifndef EIGEN_PARSED_BY_DOXYGEN
244 
249  EIGEN_DEPRECATED typedef CwiseNullaryOp<internal::linspaced_op<Scalar>, PlainObject> SequentialLinSpacedReturnType;
251  typedef CwiseNullaryOp<internal::linspaced_op<Scalar>, PlainObject> RandomAccessLinSpacedReturnType;
253  typedef CwiseNullaryOp<internal::equalspaced_op<Scalar>, PlainObject> RandomAccessEqualSpacedReturnType;
256  internal::traits<Derived>::ColsAtCompileTime, 1>
257  EigenvaluesReturnType;
258 
259 #endif // not EIGEN_PARSED_BY_DOXYGEN
260 
262  template <typename OtherDerived>
263  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const DenseBase<OtherDerived>& other);
264 
268  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const DenseBase& other);
269 
270  template <typename OtherDerived>
271  EIGEN_DEVICE_FUNC Derived& operator=(const EigenBase<OtherDerived>& other);
272 
273  template <typename OtherDerived>
274  EIGEN_DEVICE_FUNC Derived& operator+=(const EigenBase<OtherDerived>& other);
275 
276  template <typename OtherDerived>
277  EIGEN_DEVICE_FUNC Derived& operator-=(const EigenBase<OtherDerived>& other);
278 
279  template <typename OtherDerived>
280  EIGEN_DEVICE_FUNC Derived& operator=(const ReturnByValue<OtherDerived>& func);
281 
284  template <typename OtherDerived>
286  EIGEN_DEPRECATED EIGEN_DEVICE_FUNC Derived& lazyAssign(const DenseBase<OtherDerived>& other);
287 
288  EIGEN_DEVICE_FUNC CommaInitializer<Derived> operator<<(const Scalar& s);
289 
290  template <unsigned int Added, unsigned int Removed>
292  EIGEN_DEPRECATED const Derived& flagged() const {
293  return derived();
294  }
295 
296  template <typename OtherDerived>
297  EIGEN_DEVICE_FUNC CommaInitializer<Derived> operator<<(const DenseBase<OtherDerived>& other);
298 
299  typedef Transpose<Derived> TransposeReturnType;
300  EIGEN_DEVICE_FUNC TransposeReturnType transpose();
302  EIGEN_DEVICE_FUNC const ConstTransposeReturnType transpose() const;
303  EIGEN_DEVICE_FUNC void transposeInPlace();
304 
305  EIGEN_DEVICE_FUNC static const ConstantReturnType Constant(Index rows, Index cols, const Scalar& value);
306  EIGEN_DEVICE_FUNC static const ConstantReturnType Constant(Index size, const Scalar& value);
307  EIGEN_DEVICE_FUNC static const ConstantReturnType Constant(const Scalar& value);
308 
309  EIGEN_DEPRECATED_WITH_REASON("The method may result in accuracy loss. Use .EqualSpaced() instead.")
310  EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType LinSpaced(Sequential_t, Index size, const Scalar& low,
311  const Scalar& high);
312  EIGEN_DEPRECATED_WITH_REASON("The method may result in accuracy loss. Use .EqualSpaced() instead.")
313  EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType LinSpaced(Sequential_t, const Scalar& low,
314  const Scalar& high);
315 
316  EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType LinSpaced(Index size, const Scalar& low,
317  const Scalar& high);
318  EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType LinSpaced(const Scalar& low, const Scalar& high);
319 
320  EIGEN_DEVICE_FUNC static const RandomAccessEqualSpacedReturnType EqualSpaced(Index size, const Scalar& low,
321  const Scalar& step);
322  EIGEN_DEVICE_FUNC static const RandomAccessEqualSpacedReturnType EqualSpaced(const Scalar& low, const Scalar& step);
323 
324  template <typename CustomNullaryOp>
325  EIGEN_DEVICE_FUNC static const CwiseNullaryOp<CustomNullaryOp, PlainObject> NullaryExpr(Index rows, Index cols,
326  const CustomNullaryOp& func);
327  template <typename CustomNullaryOp>
328  EIGEN_DEVICE_FUNC static const CwiseNullaryOp<CustomNullaryOp, PlainObject> NullaryExpr(Index size,
329  const CustomNullaryOp& func);
330  template <typename CustomNullaryOp>
331  EIGEN_DEVICE_FUNC static const CwiseNullaryOp<CustomNullaryOp, PlainObject> NullaryExpr(const CustomNullaryOp& func);
332 
333  EIGEN_DEVICE_FUNC static const ZeroReturnType Zero(Index rows, Index cols);
334  EIGEN_DEVICE_FUNC static const ZeroReturnType Zero(Index size);
335  EIGEN_DEVICE_FUNC static const ZeroReturnType Zero();
336  EIGEN_DEVICE_FUNC static const ConstantReturnType Ones(Index rows, Index cols);
337  EIGEN_DEVICE_FUNC static const ConstantReturnType Ones(Index size);
338  EIGEN_DEVICE_FUNC static const ConstantReturnType Ones();
339 
340  EIGEN_DEVICE_FUNC void fill(const Scalar& value);
341  EIGEN_DEVICE_FUNC Derived& setConstant(const Scalar& value);
342  EIGEN_DEVICE_FUNC Derived& setLinSpaced(Index size, const Scalar& low, const Scalar& high);
343  EIGEN_DEVICE_FUNC Derived& setLinSpaced(const Scalar& low, const Scalar& high);
344  EIGEN_DEVICE_FUNC Derived& setEqualSpaced(Index size, const Scalar& low, const Scalar& step);
345  EIGEN_DEVICE_FUNC Derived& setEqualSpaced(const Scalar& low, const Scalar& step);
346  EIGEN_DEVICE_FUNC Derived& setZero();
347  EIGEN_DEVICE_FUNC Derived& setOnes();
348  EIGEN_DEVICE_FUNC Derived& setRandom();
349 
350  template <typename OtherDerived>
351  EIGEN_DEVICE_FUNC bool isApprox(const DenseBase<OtherDerived>& other,
352  const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
353  EIGEN_DEVICE_FUNC bool isMuchSmallerThan(const RealScalar& other,
354  const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
355  template <typename OtherDerived>
356  EIGEN_DEVICE_FUNC bool isMuchSmallerThan(const DenseBase<OtherDerived>& other,
357  const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
358 
359  EIGEN_DEVICE_FUNC bool isApproxToConstant(const Scalar& value,
360  const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
361  EIGEN_DEVICE_FUNC bool isConstant(const Scalar& value,
362  const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
363  EIGEN_DEVICE_FUNC bool isZero(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
364  EIGEN_DEVICE_FUNC bool isOnes(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
365 
366  EIGEN_DEVICE_FUNC inline bool hasNaN() const;
367  EIGEN_DEVICE_FUNC inline bool allFinite() const;
368 
369  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator*=(const Scalar& other);
370  template <bool Enable = !internal::is_same<Scalar, RealScalar>::value, typename = std::enable_if_t<Enable>>
371  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator*=(const RealScalar& other);
372 
373  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator/=(const Scalar& other);
374  template <bool Enable = !internal::is_same<Scalar, RealScalar>::value, typename = std::enable_if_t<Enable>>
375  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator/=(const RealScalar& other);
376 
377  typedef internal::add_const_on_value_type_t<typename internal::eval<Derived>::type> EvalReturnType;
386  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EvalReturnType eval() const {
387  // Even though MSVC does not honor strong inlining when the return type
388  // is a dynamic matrix, we desperately need strong inlining for fixed
389  // size types on MSVC.
390  return typename internal::eval<Derived>::type(derived());
391  }
392 
396  template <typename OtherDerived>
397  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void swap(const DenseBase<OtherDerived>& other) {
398  EIGEN_STATIC_ASSERT(!OtherDerived::IsPlainObjectBase, THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY);
399  eigen_assert(rows() == other.rows() && cols() == other.cols());
400  call_assignment(derived(), other.const_cast_derived(), internal::swap_assign_op<Scalar>());
401  }
402 
406  template <typename OtherDerived>
407  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void swap(PlainObjectBase<OtherDerived>& other) {
408  eigen_assert(rows() == other.rows() && cols() == other.cols());
409  call_assignment(derived(), other.derived(), internal::swap_assign_op<Scalar>());
410  }
411 
412  EIGEN_DEVICE_FUNC inline const NestByValue<Derived> nestByValue() const;
413  EIGEN_DEVICE_FUNC inline const ForceAlignedAccess<Derived> forceAlignedAccess() const;
414  EIGEN_DEVICE_FUNC inline ForceAlignedAccess<Derived> forceAlignedAccess();
415  template <bool Enable>
416  EIGEN_DEVICE_FUNC inline const std::conditional_t<Enable, ForceAlignedAccess<Derived>, Derived&>
417  forceAlignedAccessIf() const;
418  template <bool Enable>
419  EIGEN_DEVICE_FUNC inline std::conditional_t<Enable, ForceAlignedAccess<Derived>, Derived&> forceAlignedAccessIf();
420 
421  EIGEN_DEVICE_FUNC Scalar sum() const;
422  EIGEN_DEVICE_FUNC Scalar mean() const;
423  EIGEN_DEVICE_FUNC Scalar trace() const;
424 
425  EIGEN_DEVICE_FUNC Scalar prod() const;
426 
427  template <int NaNPropagation>
428  EIGEN_DEVICE_FUNC typename internal::traits<Derived>::Scalar minCoeff() const;
429  template <int NaNPropagation>
430  EIGEN_DEVICE_FUNC typename internal::traits<Derived>::Scalar maxCoeff() const;
431 
432  // By default, the fastest version with undefined NaN propagation semantics is
433  // used.
434  // TODO(rmlarsen): Replace with default template argument when we move to
435  // c++11 or beyond.
436  EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Scalar minCoeff() const {
437  return minCoeff<PropagateFast>();
438  }
439  EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Scalar maxCoeff() const {
440  return maxCoeff<PropagateFast>();
441  }
442 
443  template <int NaNPropagation, typename IndexType>
444  EIGEN_DEVICE_FUNC typename internal::traits<Derived>::Scalar minCoeff(IndexType* row, IndexType* col) const;
445  template <int NaNPropagation, typename IndexType>
446  EIGEN_DEVICE_FUNC typename internal::traits<Derived>::Scalar maxCoeff(IndexType* row, IndexType* col) const;
447  template <int NaNPropagation, typename IndexType>
448  EIGEN_DEVICE_FUNC typename internal::traits<Derived>::Scalar minCoeff(IndexType* index) const;
449  template <int NaNPropagation, typename IndexType>
450  EIGEN_DEVICE_FUNC typename internal::traits<Derived>::Scalar maxCoeff(IndexType* index) const;
451 
452  // TODO(rmlarsen): Replace these methods with a default template argument.
453  template <typename IndexType>
454  EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Scalar minCoeff(IndexType* row, IndexType* col) const {
455  return minCoeff<PropagateFast>(row, col);
456  }
457  template <typename IndexType>
458  EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Scalar maxCoeff(IndexType* row, IndexType* col) const {
459  return maxCoeff<PropagateFast>(row, col);
460  }
461  template <typename IndexType>
462  EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Scalar minCoeff(IndexType* index) const {
463  return minCoeff<PropagateFast>(index);
464  }
465  template <typename IndexType>
466  EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Scalar maxCoeff(IndexType* index) const {
467  return maxCoeff<PropagateFast>(index);
468  }
469 
470  template <typename BinaryOp>
471  EIGEN_DEVICE_FUNC Scalar redux(const BinaryOp& func) const;
472 
473  template <typename Visitor>
474  EIGEN_DEVICE_FUNC void visit(Visitor& func) const;
475 
483  inline const WithFormat<Derived> format(const IOFormat& fmt) const { return WithFormat<Derived>(derived(), fmt); }
484 
486  EIGEN_DEVICE_FUNC CoeffReturnType value() const {
487  EIGEN_STATIC_ASSERT_SIZE_1x1(Derived) eigen_assert(this->rows() == 1 && this->cols() == 1);
488  return derived().coeff(0, 0);
489  }
490 
491  EIGEN_DEVICE_FUNC bool all() const;
492  EIGEN_DEVICE_FUNC bool any() const;
493  EIGEN_DEVICE_FUNC Index count() const;
494 
499 
507  // Code moved here due to a CUDA compiler bug
508  EIGEN_DEVICE_FUNC inline ConstRowwiseReturnType rowwise() const { return ConstRowwiseReturnType(derived()); }
509  EIGEN_DEVICE_FUNC RowwiseReturnType rowwise();
510 
518  EIGEN_DEVICE_FUNC inline ConstColwiseReturnType colwise() const { return ConstColwiseReturnType(derived()); }
519  EIGEN_DEVICE_FUNC ColwiseReturnType colwise();
520 
522  static const RandomReturnType Random(Index rows, Index cols);
523  static const RandomReturnType Random(Index size);
524  static const RandomReturnType Random();
525 
526  template <typename ThenDerived, typename ElseDerived>
527  inline EIGEN_DEVICE_FUNC
530  ThenDerived, ElseDerived, Derived>
531  select(const DenseBase<ThenDerived>& thenMatrix, const DenseBase<ElseDerived>& elseMatrix) const;
532 
533  template <typename ThenDerived>
534  inline EIGEN_DEVICE_FUNC
537  ThenDerived, typename DenseBase<ThenDerived>::ConstantReturnType, Derived>
538  select(const DenseBase<ThenDerived>& thenMatrix, const typename DenseBase<ThenDerived>::Scalar& elseScalar) const;
539 
540  template <typename ElseDerived>
541  inline EIGEN_DEVICE_FUNC
544  typename DenseBase<ElseDerived>::ConstantReturnType, ElseDerived, Derived>
545  select(const typename DenseBase<ElseDerived>::Scalar& thenScalar, const DenseBase<ElseDerived>& elseMatrix) const;
546 
547  template <int p>
548  RealScalar lpNorm() const;
549 
550  template <int RowFactor, int ColFactor>
551  EIGEN_DEVICE_FUNC const Replicate<Derived, RowFactor, ColFactor> replicate() const;
560  // Code moved here due to a CUDA compiler bug
561  EIGEN_DEVICE_FUNC const Replicate<Derived, Dynamic, Dynamic> replicate(Index rowFactor, Index colFactor) const {
562  return Replicate<Derived, Dynamic, Dynamic>(derived(), rowFactor, colFactor);
563  }
567  EIGEN_DEVICE_FUNC ReverseReturnType reverse();
569  // Code moved here due to a CUDA compiler bug
570  EIGEN_DEVICE_FUNC ConstReverseReturnType reverse() const { return ConstReverseReturnType(derived()); }
571  EIGEN_DEVICE_FUNC void reverseInPlace();
572 
573 #ifdef EIGEN_PARSED_BY_DOXYGEN
574 
577  typedef random_access_iterator_type iterator;
579  typedef random_access_iterator_type const_iterator;
580 #else
581  typedef std::conditional_t<(Flags & DirectAccessBit) == DirectAccessBit,
582  internal::pointer_based_stl_iterator<Derived>,
583  internal::generic_randaccess_stl_iterator<Derived> >
584  iterator_type;
585 
586  typedef std::conditional_t<(Flags & DirectAccessBit) == DirectAccessBit,
587  internal::pointer_based_stl_iterator<const Derived>,
588  internal::generic_randaccess_stl_iterator<const Derived> >
589  const_iterator_type;
590 
591  // Stl-style iterators are supported only for vectors.
592 
593  typedef std::conditional_t<IsVectorAtCompileTime, iterator_type, void> iterator;
594 
595  typedef std::conditional_t<IsVectorAtCompileTime, const_iterator_type, void> const_iterator;
596 #endif
597 
598  inline iterator begin();
599  inline const_iterator begin() const;
600  inline const_iterator cbegin() const;
601  inline iterator end();
602  inline const_iterator end() const;
603  inline const_iterator cend() const;
604 
605  using RealViewReturnType = std::conditional_t<NumTraits<Scalar>::IsComplex, RealView<Derived>, Derived&>;
606  using ConstRealViewReturnType =
607  std::conditional_t<NumTraits<Scalar>::IsComplex, RealView<const Derived>, const Derived&>;
608 
609  EIGEN_DEVICE_FUNC RealViewReturnType realView();
610  EIGEN_DEVICE_FUNC ConstRealViewReturnType realView() const;
612 #define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::DenseBase
613 #define EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
614 #define EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(COND)
615 #define EIGEN_DOC_UNARY_ADDONS(X, Y)
616 #include "../plugins/CommonCwiseUnaryOps.inc"
617 #include "../plugins/BlockMethods.inc"
618 #include "../plugins/IndexedViewMethods.inc"
619 #include "../plugins/ReshapedMethods.inc"
620 #ifdef EIGEN_DENSEBASE_PLUGIN
621 #include EIGEN_DENSEBASE_PLUGIN
622 #endif
623 #undef EIGEN_CURRENT_STORAGE_BASE_CLASS
624 #undef EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
625 #undef EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF
626 #undef EIGEN_DOC_UNARY_ADDONS
627 
628  // disable the use of evalTo for dense objects with a nice compilation error
629  template <typename Dest>
630  EIGEN_DEVICE_FUNC inline void evalTo(Dest&) const {
631  EIGEN_STATIC_ASSERT((internal::is_same<Dest, void>::value),
632  THE_EVAL_EVALTO_FUNCTION_SHOULD_NEVER_BE_CALLED_FOR_DENSE_OBJECTS);
633  }
634 
635  protected:
636  EIGEN_DEFAULT_COPY_CONSTRUCTOR(DenseBase)
638 #ifdef EIGEN_INTERNAL_DEBUGGING
639  EIGEN_DEVICE_FUNC constexpr DenseBase() {
640  /* Just checks for self-consistency of the flags.
641  * Only do it when debugging Eigen, as this borders on paranoia and could slow compilation down
642  */
643  EIGEN_STATIC_ASSERT(
644  (internal::check_implication(MaxRowsAtCompileTime == 1 && MaxColsAtCompileTime != 1, int(IsRowMajor)) &&
645  internal::check_implication(MaxColsAtCompileTime == 1 && MaxRowsAtCompileTime != 1, int(!IsRowMajor))),
646  INVALID_STORAGE_ORDER_FOR_THIS_VECTOR_EXPRESSION)
647  }
648 #else
649  EIGEN_DEVICE_FUNC constexpr DenseBase() = default;
650 #endif
651 
652  private:
653  EIGEN_DEVICE_FUNC explicit DenseBase(int);
654  EIGEN_DEVICE_FUNC DenseBase(int, int);
655  template <typename OtherDerived>
656  EIGEN_DEVICE_FUNC explicit DenseBase(const DenseBase<OtherDerived>&);
657 };
658 
661 template <typename DerivedA, typename DerivedB>
662 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
663  // Use forwarding references to capture all combinations of cv-qualified l+r-value cases.
664  std::enable_if_t<std::is_base_of<DenseBase<std::decay_t<DerivedA>>, std::decay_t<DerivedA>>::value &&
665  std::is_base_of<DenseBase<std::decay_t<DerivedB>>, std::decay_t<DerivedB>>::value,
666  void>
667  swap(DerivedA&& a, DerivedB&& b) {
668  a.swap(b);
669 }
670 
671 } // end namespace Eigen
672 
673 #endif // EIGEN_DENSEBASE_H
Definition: DenseBase.h:124
Generic expression of a matrix where all coefficients are defined by a functor.
Definition: CwiseNullaryOp.h:63
Scalar sum() const
Definition: Redux.h:488
const Replicate< Derived, Dynamic, Dynamic > replicate(Index rowFactor, Index colFactor) const
Definition: DenseBase.h:561
constexpr DenseBase()=default
bool isZero(const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition: CwiseNullaryOp.h:536
ConstReverseReturnType reverse() const
Definition: DenseBase.h:570
ColXpr col(Index i)
Definition: DenseBase.h:1072
constexpr Index size() const noexcept
Definition: EigenBase.h:64
Enforce aligned packet loads and stores regardless of what is requested.
Definition: ForceAlignedAccess.h:37
internal::traits< Derived >::Scalar Scalar
Definition: DenseBase.h:62
Definition: Constants.h:318
bool allFinite() const
Definition: Visitor.h:531
std::conditional_t< internal::is_same< typename internal::traits< Derived >::XprKind, MatrixXpr >::value, PlainMatrix, PlainArray > PlainObject
The plain matrix or array type corresponding to this expression.
Definition: DenseBase.h:204
static const ZeroReturnType Zero()
Definition: CwiseNullaryOp.h:523
Expression of the transpose of a matrix.
Definition: Transpose.h:56
const unsigned int DirectAccessBit
Definition: Constants.h:159
static const RandomAccessLinSpacedReturnType LinSpaced(Sequential_t, Index size, const Scalar &low, const Scalar &high)
Definition: CwiseNullaryOp.h:239
Derived & setRandom()
Definition: Random.h:129
Definition: DenseBase.h:147
Namespace containing all symbols from the Eigen library.
Definition: B01_Experimental.dox:1
Scalar value_type
Definition: DenseBase.h:67
Derived & operator=(const DenseBase< OtherDerived > &other)
Definition: Assign.h:39
random_access_iterator_type const_iterator
Definition: DenseBase.h:579
Index count() const
Definition: Visitor.h:513
Definition: BFloat16.h:231
Definition: DenseBase.h:154
Holds information about the various numeric (i.e. scalar) types allowed by Eigen. ...
Definition: NumTraits.h:232
RowXpr row(Index i)
Definition: DenseBase.h:1085
Definition: DenseBase.h:102
Pseudo expression providing broadcasting and partial reduction operations.
Definition: ForwardDeclarations.h:405
const WithFormat< Derived > format(const IOFormat &fmt) const
Definition: DenseBase.h:483
constexpr Index outerSize() const
Definition: DenseBase.h:211
Eigen::Index Index
The interface type of indices.
Definition: EigenBase.h:43
const unsigned int RowMajorBit
Definition: Constants.h:70
Base class for all dense matrices, vectors, and arrays.
Definition: DenseBase.h:38
iterator begin()
Definition: StlIterators.h:570
CommaInitializer< Derived > operator<<(const Scalar &s)
Definition: CommaInitializer.h:135
const NestByValue< Derived > nestByValue() const
Definition: NestByValue.h:74
static const RandomReturnType Random()
Definition: Random.h:112
constexpr Index rows() const noexcept
Definition: EigenBase.h:59
static const ConstantReturnType Constant(Index rows, Index cols, const Scalar &value)
Definition: CwiseNullaryOp.h:186
void resize(Index newSize)
Definition: DenseBase.h:228
Helper class used by the comma initializer operator.
Definition: CommaInitializer.h:31
internal::traits< Derived >::StorageIndex StorageIndex
The type used to store indices.
Definition: DenseBase.h:59
Definition: EigenBase.h:33
Definition: Constants.h:534
const Replicate< Derived, RowFactor, ColFactor > replicate() const
Definition: Replicate.h:109
constexpr Index cols() const noexcept
Definition: EigenBase.h:61
Definition: Constants.h:322
static const CwiseNullaryOp< CustomNullaryOp, PlainObject > NullaryExpr(Index rows, Index cols, const CustomNullaryOp &func)
Definition: CwiseNullaryOp.h:112
void visit(Visitor &func) const
Definition: Visitor.h:380
constexpr Index innerSize() const
Definition: DenseBase.h:220
Definition: DenseBase.h:135
void fill(const Scalar &value)
Definition: CwiseNullaryOp.h:337
bool all() const
Definition: Visitor.h:487
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:82
Definition: DenseBase.h:108
Dense storage base class for matrices and arrays.
Definition: PlainObjectBase.h:95
Generic expression where a coefficient-wise ternary operator is applied to two expressions.
Definition: CwiseTernaryOp.h:84
Expression of the multiple replication of a matrix or vector.
Definition: Replicate.h:64
bool isConstant(const Scalar &value, const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition: CwiseNullaryOp.h:328
iterator end()
Definition: StlIterators.h:596
EIGEN_DEPRECATED const Derived & flagged() const
Definition: DenseBase.h:292
Scalar prod() const
Definition: Redux.h:517
Definition: DenseBase.h:96
Matrix< typename internal::traits< Derived >::Scalar, internal::traits< Derived >::RowsAtCompileTime, internal::traits< Derived >::ColsAtCompileTime, AutoAlign|(internal::traits< Derived >::Flags &RowMajorBit ? RowMajor :ColMajor), internal::traits< Derived >::MaxRowsAtCompileTime, internal::traits< Derived >::MaxColsAtCompileTime > PlainMatrix
Definition: DenseBase.h:186
bool any() const
Definition: Visitor.h:500
Expression which must be nested by value.
Definition: NestByValue.h:39
void swap(const DenseBase< OtherDerived > &other)
Definition: DenseBase.h:397
ConstColwiseReturnType colwise() const
Definition: DenseBase.h:518
ReverseReturnType reverse()
Definition: Reverse.h:110
static const ConstantReturnType Ones()
Definition: CwiseNullaryOp.h:667
Derived & setLinSpaced(Index size, const Scalar &low, const Scalar &high)
Sets a linearly spaced vector.
Definition: CwiseNullaryOp.h:430
constexpr Derived & derived()
Definition: EigenBase.h:49
EIGEN_DEPRECATED_WITH_REASON("Initialization is no longer needed.") inline void initParallel()
Definition: Parallelizer.h:50
Definition: DenseBase.h:166
random_access_iterator_type iterator
Definition: DenseBase.h:577
Definition: DenseBase.h:161
ConstRowwiseReturnType rowwise() const
Definition: DenseBase.h:508
Derived & setZero()
Definition: CwiseNullaryOp.h:552
General-purpose arrays with easy API for coefficient-wise operations.
Definition: Array.h:48
Definition: Constants.h:320
bool isApproxToConstant(const Scalar &value, const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition: CwiseNullaryOp.h:316
Derived & setOnes()
Definition: CwiseNullaryOp.h:692
const_iterator cbegin() const
Definition: StlIterators.h:586
void reverseInPlace()
Definition: Reverse.h:129
Derived & setConstant(const Scalar &value)
Definition: CwiseNullaryOp.h:347
CoeffReturnType value() const
Definition: DenseBase.h:486
TransposeReturnType transpose()
Definition: Transpose.h:162
EvalReturnType eval() const
Definition: DenseBase.h:386
internal::traits< Derived >::Scalar minCoeff() const
Definition: Redux.h:464
void transposeInPlace()
Definition: Transpose.h:320
The matrix class, also used for vectors and row-vectors.
Definition: Matrix.h:186
constexpr Index rows() const noexcept
Definition: EigenBase.h:59
Pseudo expression providing matrix output with given format.
Definition: IO.h:101
constexpr Index cols() const noexcept
Definition: EigenBase.h:61
Expression of the reverse of a vector or matrix.
Definition: Reverse.h:65
Definition: DenseBase.h:113
bool isOnes(const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition: CwiseNullaryOp.h:680
EIGEN_DEPRECATED Derived & lazyAssign(const DenseBase< OtherDerived > &other)
internal::traits< Derived >::Scalar maxCoeff() const
Definition: Redux.h:477
Stores a set of parameters controlling the way matrices are printed.
Definition: IO.h:52
Scalar mean() const
Definition: Redux.h:498
void resize(Index rows, Index cols)
Definition: DenseBase.h:236
void swap(PlainObjectBase< OtherDerived > &other)
Definition: DenseBase.h:407
Eigen::InnerIterator< Derived > InnerIterator
Definition: DenseBase.h:49
const_iterator cend() const
Definition: StlIterators.h:612
An InnerIterator allows to loop over the element of any matrix expression.
Definition: CoreIterators.h:37
bool isApprox(const DenseBase< OtherDerived > &other, const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition: Fuzzy.h:89