Eigen  5.0.1-dev+60122df6
 
Loading...
Searching...
No Matches
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
17namespace Eigen {
18
19// The index type defined by EIGEN_DEFAULT_DENSE_INDEX_TYPE must be a signed type.
20EIGEN_STATIC_ASSERT(NumTraits<DenseIndex>::IsSigned, THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE)
21
22
37template <typename Derived>
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;
62 typedef typename internal::traits<Derived>::Scalar Scalar;
63
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;
94 enum {
95
96 RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
101
102 ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
107
108 SizeAtCompileTime = (internal::size_of_xpr_at_compile_time<Derived>::ret),
112
113 MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,
118 * This value is useful to know when evaluating an expression, in order to determine
119 * whether it is possible to avoid doing a dynamic memory allocation.
120 *
121 * \sa RowsAtCompileTime, MaxColsAtCompileTime, MaxSizeAtCompileTime
122 */
123
124 MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime,
129
134
135 MaxSizeAtCompileTime = internal::size_at_compile_time(internal::traits<Derived>::MaxRowsAtCompileTime,
136 internal::traits<Derived>::MaxColsAtCompileTime),
146
148 internal::traits<Derived>::RowsAtCompileTime == 1 || internal::traits<Derived>::ColsAtCompileTime == 1,
151 * we are dealing with a column-vector (if there is only one column) or with
152 * a row-vector (if there is only one row). */
153
155 : bool(IsVectorAtCompileTime) ? 1
156 : 2,
160
161 Flags = internal::traits<Derived>::Flags,
165
167
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
217 * \note For a vector, this is just the size. For a matrix (non-vector), this is the minor dimension
218 * with respect to the \ref TopicStorageOrders "storage order", i.e., the number of rows for a
219 * column-major matrix, and the number of columns for a row-major matrix. */
220 EIGEN_DEVICE_FUNC constexpr Index innerSize() const {
221 return IsVectorAtCompileTime ? this->size() : int(IsRowMajor) ? this->cols() : this->rows();
222 }
226
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 }
232
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
245 typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> ConstantReturnType;
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;
254 /** \internal the return type of MatrixBase::eigenvalues() */
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>
285 /** \deprecated */
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>
291
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();
301 typedef Transpose<const Derived> ConstTransposeReturnType;
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 {
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 {
460 }
461 template <typename IndexType>
462 EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Scalar minCoeff(IndexType* index) const {
463 return minCoeff<PropagateFast>(index);
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
495 typedef VectorwiseOp<Derived, Horizontal> RowwiseReturnType;
496 typedef const VectorwiseOp<const Derived, Horizontal> ConstRowwiseReturnType;
497 typedef VectorwiseOp<Derived, Vertical> ColwiseReturnType;
498 typedef const VectorwiseOp<const Derived, Vertical> ConstColwiseReturnType;
499
504
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
514 * Output: \verbinclude MatrixBase_colwise.out
515 *
516 * \sa rowwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
517 */
518 EIGEN_DEVICE_FUNC inline ConstColwiseReturnType colwise() const { return ConstColwiseReturnType(derived()); }
519 EIGEN_DEVICE_FUNC ColwiseReturnType colwise();
520
521 typedef CwiseNullaryOp<internal::scalar_random_op<Scalar>, PlainObject> RandomReturnType;
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>
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 }
565 typedef Reverse<Derived, BothDirections> ReverseReturnType;
566 typedef const Reverse<const Derived, BothDirections> ConstReverseReturnType;
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
661template <typename DerivedA, typename DerivedB>
662EIGEN_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
General-purpose arrays with easy API for coefficient-wise operations.
Definition Array.h:48
Generic expression of a matrix where all coefficients are defined by a functor.
Definition CwiseNullaryOp.h:64
Generic expression where a coefficient-wise ternary operator is applied to two expressions.
Definition CwiseTernaryOp.h:86
Base class for all dense matrices, vectors, and arrays.
Definition DenseBase.h:44
internal::traits< Derived >::Scalar minCoeff() const
Definition Redux.h:464
RowXpr row(Index i)
Definition DenseBase.h:1085
CommaInitializer< Derived > operator<<(const Scalar &s)
Definition CommaInitializer.h:135
const WithFormat< Derived > format(const IOFormat &fmt) const
Definition DenseBase.h:483
bool isConstant(const Scalar &value, const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition CwiseNullaryOp.h:328
Derived & setOnes()
Definition CwiseNullaryOp.h:692
void resize(Index rows, Index cols)
Definition DenseBase.h:236
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
ColXpr col(Index i)
Definition DenseBase.h:1072
internal::traits< Derived >::StorageIndex StorageIndex
The type used to store indices.
Definition DenseBase.h:59
constexpr Index outerSize() const
Definition DenseBase.h:211
void resize(Index newSize)
Definition DenseBase.h:228
random_access_iterator_type const_iterator
Definition DenseBase.h:579
static const CwiseNullaryOp< CustomNullaryOp, PlainObject > NullaryExpr(Index rows, Index cols, const CustomNullaryOp &func)
Definition CwiseNullaryOp.h:112
ReverseReturnType reverse()
Definition Reverse.h:110
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
TransposeReturnType transpose()
Definition Transpose.h:162
void swap(PlainObjectBase< OtherDerived > &other)
Definition DenseBase.h:407
Eigen::InnerIterator< Derived > InnerIterator
Definition DenseBase.h:49
iterator begin()
Definition StlIterators.h:570
ConstColwiseReturnType colwise() const
Definition DenseBase.h:518
Derived & setLinSpaced(Index size, const Scalar &low, const Scalar &high)
Sets a linearly spaced vector.
Definition CwiseNullaryOp.h:430
internal::traits< Derived >::Scalar Scalar
Definition DenseBase.h:62
const Replicate< Derived, RowFactor, ColFactor > replicate() const
Definition Replicate.h:109
static const ZeroReturnType Zero(Index rows, Index cols)
Definition CwiseNullaryOp.h:485
static const ConstantReturnType Constant(Index rows, Index cols, const Scalar &value)
Definition CwiseNullaryOp.h:186
const Replicate< Derived, Dynamic, Dynamic > replicate(Index rowFactor, Index colFactor) const
Definition DenseBase.h:561
internal::traits< Derived >::Scalar maxCoeff() const
Definition Redux.h:477
Array< 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 > PlainArray
Definition DenseBase.h:194
CoeffReturnType value() const
Definition DenseBase.h:486
static const ConstantReturnType Ones(Index rows, Index cols)
Definition CwiseNullaryOp.h:629
@ IsVectorAtCompileTime
Definition DenseBase.h:147
@ SizeAtCompileTime
Definition DenseBase.h:108
@ MaxSizeAtCompileTime
Definition DenseBase.h:135
@ IsRowMajor
Definition DenseBase.h:166
@ NumDimensions
Definition DenseBase.h:154
@ Flags
Definition DenseBase.h:161
@ ColsAtCompileTime
Definition DenseBase.h:102
@ MaxColsAtCompileTime
Definition DenseBase.h:124
@ MaxRowsAtCompileTime
Definition DenseBase.h:113
@ RowsAtCompileTime
Definition DenseBase.h:96
Scalar value_type
Definition DenseBase.h:67
void fill(const Scalar &value)
Definition CwiseNullaryOp.h:337
constexpr DenseBase()=default
ConstRowwiseReturnType rowwise() const
Definition DenseBase.h:508
bool isOnes(const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition CwiseNullaryOp.h:680
EvalReturnType eval() const
Definition DenseBase.h:386
constexpr Index innerSize() const
Definition DenseBase.h:220
Derived & operator=(const DenseBase< OtherDerived > &other)
Definition Assign.h:39
Derived & setConstant(const Scalar &value)
Definition CwiseNullaryOp.h:347
Derived & setRandom()
Definition Random.h:129
void transposeInPlace()
Definition Transpose.h:320
EIGEN_DEPRECATED const Derived & flagged() const
Definition DenseBase.h:292
iterator end()
Definition StlIterators.h:596
bool isApprox(const DenseBase< OtherDerived > &other, const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition Fuzzy.h:89
const_iterator cbegin() const
Definition StlIterators.h:586
const_iterator cend() const
Definition StlIterators.h:612
static const RandomAccessLinSpacedReturnType LinSpaced(Sequential_t, Index size, const Scalar &low, const Scalar &high)
Definition CwiseNullaryOp.h:239
EIGEN_DEPRECATED Derived & lazyAssign(const DenseBase< OtherDerived > &other)
bool allFinite() const
Definition Visitor.h:531
Derived & setZero()
Definition CwiseNullaryOp.h:552
bool isZero(const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition CwiseNullaryOp.h:536
random_access_iterator_type iterator
Definition DenseBase.h:577
bool isApproxToConstant(const Scalar &value, const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition CwiseNullaryOp.h:316
void swap(const DenseBase< OtherDerived > &other)
Definition DenseBase.h:397
Enforce aligned packet loads and stores regardless of what is requested.
Definition ForceAlignedAccess.h:37
An InnerIterator allows to loop over the element of any matrix expression.
Definition CoreIterators.h:37
The matrix class, also used for vectors and row-vectors.
Definition Matrix.h:186
Expression which must be nested by value.
Definition NestByValue.h:39
Dense storage base class for matrices and arrays.
Definition PlainObjectBase.h:95
Expression of the multiple replication of a matrix or vector.
Definition Replicate.h:64
Expression of the reverse of a vector or matrix.
Definition Reverse.h:65
Expression of the transpose of a matrix.
Definition Transpose.h:56
Pseudo expression providing broadcasting and partial reduction operations.
Definition VectorwiseOp.h:205
Pseudo expression providing matrix output with given format.
Definition IO.h:101
@ ColMajor
Definition Constants.h:318
@ RowMajor
Definition Constants.h:320
@ AutoAlign
Definition Constants.h:322
const unsigned int DirectAccessBit
Definition Constants.h:159
const unsigned int RowMajorBit
Definition Constants.h:70
Namespace containing all symbols from the Eigen library.
Definition B01_Experimental.dox:1
EIGEN_DEPRECATED_WITH_REASON("Initialization is no longer needed.") inline void initParallel()
Definition Parallelizer.h:50
std::enable_if_t< std::is_base_of< DenseBase< std::decay_t< DerivedA > >, std::decay_t< DerivedA > >::value &&std::is_base_of< DenseBase< std::decay_t< DerivedB > >, std::decay_t< DerivedB > >::value, void > swap(DerivedA &&a, DerivedB &&b)
Definition DenseBase.h:667
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:82
Helper class used by the comma initializer operator.
Definition CommaInitializer.h:31
Definition EigenBase.h:33
Stores a set of parameters controlling the way matrices are printed.
Definition IO.h:52
Definition Constants.h:534