Eigen  3.2.7
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
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 <[email protected]>
5 // Copyright (C) 2008-2010 Gael Guennebaud <[email protected]>
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 namespace Eigen {
15 
16 namespace internal {
17 
18 // The index type defined by EIGEN_DEFAULT_DENSE_INDEX_TYPE must be a signed type.
19 // This dummy function simply aims at checking that at compile time.
20 static inline void check_DenseIndex_is_signed() {
21  EIGEN_STATIC_ASSERT(NumTraits<DenseIndex>::IsSigned,THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE);
22 }
23 
24 } // end namespace internal
25 
41 template<typename Derived> class DenseBase
42 #ifndef EIGEN_PARSED_BY_DOXYGEN
43  : public internal::special_scalar_op_base<Derived, typename internal::traits<Derived>::Scalar,
44  typename NumTraits<typename internal::traits<Derived>::Scalar>::Real,
45  DenseCoeffsBase<Derived> >
46 #else
47  : public DenseCoeffsBase<Derived>
48 #endif // not EIGEN_PARSED_BY_DOXYGEN
49 {
50  public:
51 
52  class InnerIterator;
53 
54  typedef typename internal::traits<Derived>::StorageKind StorageKind;
55 
60  typedef typename internal::traits<Derived>::Index Index;
61 
62  typedef typename internal::traits<Derived>::Scalar Scalar;
63  typedef typename internal::packet_traits<Scalar>::type PacketScalar;
64  typedef typename NumTraits<Scalar>::Real RealScalar;
65  typedef internal::special_scalar_op_base<Derived,Scalar,RealScalar, DenseCoeffsBase<Derived> > Base;
66 
67  using Base::operator*;
68  using Base::derived;
69  using Base::const_cast_derived;
70  using Base::rows;
71  using Base::cols;
72  using Base::size;
73  using Base::rowIndexByOuterInner;
74  using Base::colIndexByOuterInner;
75  using Base::coeff;
76  using Base::coeffByOuterInner;
77  using Base::packet;
78  using Base::packetByOuterInner;
79  using Base::writePacket;
80  using Base::writePacketByOuterInner;
81  using Base::coeffRef;
82  using Base::coeffRefByOuterInner;
83  using Base::copyCoeff;
84  using Base::copyCoeffByOuterInner;
85  using Base::copyPacket;
86  using Base::copyPacketByOuterInner;
87  using Base::operator();
88  using Base::operator[];
89  using Base::x;
90  using Base::y;
91  using Base::z;
92  using Base::w;
93  using Base::stride;
94  using Base::innerStride;
95  using Base::outerStride;
96  using Base::rowStride;
97  using Base::colStride;
98  typedef typename Base::CoeffReturnType CoeffReturnType;
99 
100  enum {
101 
102  RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
108  ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
115  SizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::RowsAtCompileTime,
116  internal::traits<Derived>::ColsAtCompileTime>::ret),
121  MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,
132  MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime,
143  MaxSizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::MaxRowsAtCompileTime,
144  internal::traits<Derived>::MaxColsAtCompileTime>::ret),
155  IsVectorAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime == 1
156  || internal::traits<Derived>::MaxColsAtCompileTime == 1,
162  Flags = internal::traits<Derived>::Flags,
169  InnerSizeAtCompileTime = int(IsVectorAtCompileTime) ? int(SizeAtCompileTime)
170  : int(IsRowMajor) ? int(ColsAtCompileTime) : int(RowsAtCompileTime),
171 
172  CoeffReadCost = internal::traits<Derived>::CoeffReadCost,
177  InnerStrideAtCompileTime = internal::inner_stride_at_compile_time<Derived>::ret,
178  OuterStrideAtCompileTime = internal::outer_stride_at_compile_time<Derived>::ret
179  };
180 
181  enum { ThisConstantIsPrivateInPlainObjectBase };
182 
185  inline Index nonZeros() const { return size(); }
186 
192  Index outerSize() const
193  {
194  return IsVectorAtCompileTime ? 1
195  : int(IsRowMajor) ? this->rows() : this->cols();
196  }
197 
203  Index innerSize() const
204  {
205  return IsVectorAtCompileTime ? this->size()
206  : int(IsRowMajor) ? this->cols() : this->rows();
207  }
213  void resize(Index newSize)
214  {
215  EIGEN_ONLY_USED_FOR_DEBUG(newSize);
216  eigen_assert(newSize == this->size()
217  && "DenseBase::resize() does not actually allow to resize.");
218  }
223  void resize(Index nbRows, Index nbCols)
224  {
225  EIGEN_ONLY_USED_FOR_DEBUG(nbRows);
226  EIGEN_ONLY_USED_FOR_DEBUG(nbCols);
227  eigen_assert(nbRows == this->rows() && nbCols == this->cols()
228  && "DenseBase::resize() does not actually allow to resize.");
229  }
230 
231 #ifndef EIGEN_PARSED_BY_DOXYGEN
234  typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>,Derived> ConstantReturnType;
236  typedef CwiseNullaryOp<internal::linspaced_op<Scalar,false>,Derived> SequentialLinSpacedReturnType;
238  typedef CwiseNullaryOp<internal::linspaced_op<Scalar,true>,Derived> RandomAccessLinSpacedReturnType;
240  typedef Matrix<typename NumTraits<typename internal::traits<Derived>::Scalar>::Real, internal::traits<Derived>::ColsAtCompileTime, 1> EigenvaluesReturnType;
241 
242 #endif // not EIGEN_PARSED_BY_DOXYGEN
243 
245  template<typename OtherDerived>
246  Derived& operator=(const DenseBase<OtherDerived>& other);
247 
251  Derived& operator=(const DenseBase& other);
252 
253  template<typename OtherDerived>
254  Derived& operator=(const EigenBase<OtherDerived> &other);
255 
256  template<typename OtherDerived>
257  Derived& operator+=(const EigenBase<OtherDerived> &other);
258 
259  template<typename OtherDerived>
260  Derived& operator-=(const EigenBase<OtherDerived> &other);
261 
262  template<typename OtherDerived>
263  Derived& operator=(const ReturnByValue<OtherDerived>& func);
264 
266  template<typename OtherDerived>
267  Derived& lazyAssign(const DenseBase<OtherDerived>& other);
268 
270  template<typename OtherDerived>
271  Derived& lazyAssign(const ReturnByValue<OtherDerived>& other);
272 
273  CommaInitializer<Derived> operator<< (const Scalar& s);
274 
275  template<unsigned int Added,unsigned int Removed>
276  const Flagged<Derived, Added, Removed> flagged() const;
277 
278  template<typename OtherDerived>
279  CommaInitializer<Derived> operator<< (const DenseBase<OtherDerived>& other);
280 
282  typedef typename internal::add_const<Transpose<const Derived> >::type ConstTransposeReturnType;
283  ConstTransposeReturnType transpose() const;
284  void transposeInPlace();
285 #ifndef EIGEN_NO_DEBUG
286  protected:
287  template<typename OtherDerived>
288  void checkTransposeAliasing(const OtherDerived& other) const;
289  public:
290 #endif
291 
292 
293  static const ConstantReturnType
294  Constant(Index rows, Index cols, const Scalar& value);
295  static const ConstantReturnType
296  Constant(Index size, const Scalar& value);
297  static const ConstantReturnType
298  Constant(const Scalar& value);
299 
300  static const SequentialLinSpacedReturnType
301  LinSpaced(Sequential_t, Index size, const Scalar& low, const Scalar& high);
302  static const RandomAccessLinSpacedReturnType
303  LinSpaced(Index size, const Scalar& low, const Scalar& high);
304  static const SequentialLinSpacedReturnType
305  LinSpaced(Sequential_t, const Scalar& low, const Scalar& high);
306  static const RandomAccessLinSpacedReturnType
307  LinSpaced(const Scalar& low, const Scalar& high);
308 
309  template<typename CustomNullaryOp>
311  NullaryExpr(Index rows, Index cols, const CustomNullaryOp& func);
312  template<typename CustomNullaryOp>
314  NullaryExpr(Index size, const CustomNullaryOp& func);
315  template<typename CustomNullaryOp>
317  NullaryExpr(const CustomNullaryOp& func);
318 
319  static const ConstantReturnType Zero(Index rows, Index cols);
320  static const ConstantReturnType Zero(Index size);
321  static const ConstantReturnType Zero();
322  static const ConstantReturnType Ones(Index rows, Index cols);
323  static const ConstantReturnType Ones(Index size);
324  static const ConstantReturnType Ones();
325 
326  void fill(const Scalar& value);
327  Derived& setConstant(const Scalar& value);
328  Derived& setLinSpaced(Index size, const Scalar& low, const Scalar& high);
329  Derived& setLinSpaced(const Scalar& low, const Scalar& high);
330  Derived& setZero();
331  Derived& setOnes();
332  Derived& setRandom();
333 
334  template<typename OtherDerived>
336  const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
337  bool isMuchSmallerThan(const RealScalar& other,
338  const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
339  template<typename OtherDerived>
340  bool isMuchSmallerThan(const DenseBase<OtherDerived>& other,
341  const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
342 
343  bool isApproxToConstant(const Scalar& value, const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
344  bool isConstant(const Scalar& value, const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
345  bool isZero(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
346  bool isOnes(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
347 
348  inline bool hasNaN() const;
349  inline bool allFinite() const;
350 
351  inline Derived& operator*=(const Scalar& other);
352  inline Derived& operator/=(const Scalar& other);
353 
354  typedef typename internal::add_const_on_value_type<typename internal::eval<Derived>::type>::type EvalReturnType;
360  EIGEN_STRONG_INLINE EvalReturnType eval() const
361  {
362  // Even though MSVC does not honor strong inlining when the return type
363  // is a dynamic matrix, we desperately need strong inlining for fixed
364  // size types on MSVC.
365  return typename internal::eval<Derived>::type(derived());
366  }
367 
371  template<typename OtherDerived>
372  void swap(const DenseBase<OtherDerived>& other,
373  int = OtherDerived::ThisConstantIsPrivateInPlainObjectBase)
374  {
375  SwapWrapper<Derived>(derived()).lazyAssign(other.derived());
376  }
377 
381  template<typename OtherDerived>
383  {
384  SwapWrapper<Derived>(derived()).lazyAssign(other.derived());
385  }
386 
388  inline const NestByValue<Derived> nestByValue() const;
389  inline const ForceAlignedAccess<Derived> forceAlignedAccess() const;
390  inline ForceAlignedAccess<Derived> forceAlignedAccess();
391  template<bool Enable> inline const typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type forceAlignedAccessIf() const;
392  template<bool Enable> inline typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type forceAlignedAccessIf();
393 
394  Scalar sum() const;
395  Scalar mean() const;
396  Scalar trace() const;
397 
398  Scalar prod() const;
399 
400  typename internal::traits<Derived>::Scalar minCoeff() const;
401  typename internal::traits<Derived>::Scalar maxCoeff() const;
402 
403  template<typename IndexType>
404  typename internal::traits<Derived>::Scalar minCoeff(IndexType* row, IndexType* col) const;
405  template<typename IndexType>
406  typename internal::traits<Derived>::Scalar maxCoeff(IndexType* row, IndexType* col) const;
407  template<typename IndexType>
408  typename internal::traits<Derived>::Scalar minCoeff(IndexType* index) const;
409  template<typename IndexType>
410  typename internal::traits<Derived>::Scalar maxCoeff(IndexType* index) const;
411 
412  template<typename BinaryOp>
413  typename internal::result_of<BinaryOp(typename internal::traits<Derived>::Scalar)>::type
414  redux(const BinaryOp& func) const;
415 
416  template<typename Visitor>
417  void visit(Visitor& func) const;
418 
419  inline const WithFormat<Derived> format(const IOFormat& fmt) const;
420 
422  CoeffReturnType value() const
423  {
424  EIGEN_STATIC_ASSERT_SIZE_1x1(Derived)
425  eigen_assert(this->rows() == 1 && this->cols() == 1);
426  return derived().coeff(0,0);
427  }
428 
429  bool all(void) const;
430  bool any(void) const;
431  Index count() const;
432 
437 
438  ConstRowwiseReturnType rowwise() const;
439  RowwiseReturnType rowwise();
440  ConstColwiseReturnType colwise() const;
441  ColwiseReturnType colwise();
442 
443  static const CwiseNullaryOp<internal::scalar_random_op<Scalar>,Derived> Random(Index rows, Index cols);
446 
447  template<typename ThenDerived,typename ElseDerived>
449  select(const DenseBase<ThenDerived>& thenMatrix,
450  const DenseBase<ElseDerived>& elseMatrix) const;
451 
452  template<typename ThenDerived>
454  select(const DenseBase<ThenDerived>& thenMatrix, const typename ThenDerived::Scalar& elseScalar) const;
455 
456  template<typename ElseDerived>
458  select(const typename ElseDerived::Scalar& thenScalar, const DenseBase<ElseDerived>& elseMatrix) const;
459 
460  template<int p> RealScalar lpNorm() const;
462  template<int RowFactor, int ColFactor>
464 
466  inline const ReplicateReturnType replicate(Index rowFacor,Index colFactor) const;
467 
470  ReverseReturnType reverse();
471  ConstReverseReturnType reverse() const;
472  void reverseInPlace();
473 
474 #define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::DenseBase
475 # include "../plugins/BlockMethods.h"
476 # ifdef EIGEN_DENSEBASE_PLUGIN
477 # include EIGEN_DENSEBASE_PLUGIN
478 # endif
479 #undef EIGEN_CURRENT_STORAGE_BASE_CLASS
480 
481 #ifdef EIGEN2_SUPPORT
482 
483  Block<Derived> corner(CornerType type, Index cRows, Index cCols);
484  const Block<Derived> corner(CornerType type, Index cRows, Index cCols) const;
485  template<int CRows, int CCols>
487  template<int CRows, int CCols>
488  const Block<Derived, CRows, CCols> corner(CornerType type) const;
489 
490 #endif // EIGEN2_SUPPORT
491 
492 
493  // disable the use of evalTo for dense objects with a nice compilation error
494  template<typename Dest> inline void evalTo(Dest& ) const
495  {
496  EIGEN_STATIC_ASSERT((internal::is_same<Dest,void>::value),THE_EVAL_EVALTO_FUNCTION_SHOULD_NEVER_BE_CALLED_FOR_DENSE_OBJECTS);
497  }
498 
499  protected:
502  {
503  /* Just checks for self-consistency of the flags.
504  * Only do it when debugging Eigen, as this borders on paranoiac and could slow compilation down
505  */
506 #ifdef EIGEN_INTERNAL_DEBUGGING
507  EIGEN_STATIC_ASSERT((EIGEN_IMPLIES(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, int(IsRowMajor))
508  && EIGEN_IMPLIES(MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1, int(!IsRowMajor))),
509  INVALID_STORAGE_ORDER_FOR_THIS_VECTOR_EXPRESSION)
510 #endif
511  }
512 
513  private:
514  explicit DenseBase(int);
515  DenseBase(int,int);
516  template<typename OtherDerived> explicit DenseBase(const DenseBase<OtherDerived>&);
517 };
518 
519 } // end namespace Eigen
520 
521 #endif // EIGEN_DENSEBASE_H
Generic expression of a matrix where all coefficients are defined by a functor.
Definition: CwiseNullaryOp.h:49
void resize(Index newSize)
Definition: DenseBase.h:213
Derived & setRandom()
Definition: Random.h:110
RowXpr row(Index i)
Definition: DenseBase.h:750
static const CwiseNullaryOp< CustomNullaryOp, Derived > NullaryExpr(Index rows, Index cols, const CustomNullaryOp &func)
Definition: CwiseNullaryOp.h:117
const Select< Derived, ThenDerived, ElseDerived > select(const DenseBase< ThenDerived > &thenMatrix, const DenseBase< ElseDerived > &elseMatrix) const
Definition: Select.h:124
Enforce aligned packet loads and stores regardless of what is requested.
Definition: ForceAlignedAccess.h:34
Scalar mean() const
Definition: Redux.h:373
ReverseReturnType reverse()
Definition: Reverse.h:191
internal::traits< Derived >::Scalar minCoeff() const
Definition: Redux.h:339
bool isApprox(const DenseBase< OtherDerived > &other, const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition: Fuzzy.h:98
void visit(Visitor &func) const
Definition: Visitor.h:77
Index nonZeros() const
Definition: DenseBase.h:185
Scalar prod() const
Definition: Redux.h:387
void fill(const Scalar &value)
Definition: CwiseNullaryOp.h:322
Expression of the transpose of a matrix.
Definition: Transpose.h:57
Derived & setOnes()
Definition: CwiseNullaryOp.h:625
Derived & operator=(const DenseBase< OtherDerived > &other)
Definition: Assign.h:550
bool hasNaN() const
Definition: BooleanRedux.h:137
bool any(void) const
Definition: BooleanRedux.h:103
CornerType
Definition: Constants.h:201
void resize(Index nbRows, Index nbCols)
Definition: DenseBase.h:223
void swap(const DenseBase< OtherDerived > &other, int=OtherDerived::ThisConstantIsPrivateInPlainObjectBase)
Definition: DenseBase.h:372
DenseBase()
Definition: DenseBase.h:501
Derived & setZero()
Definition: CwiseNullaryOp.h:499
Holds information about the various numeric (i.e. scalar) types allowed by Eigen. ...
Definition: NumTraits.h:88
Index count() const
Definition: BooleanRedux.h:127
internal::traits< Derived >::Scalar maxCoeff() const
Definition: Redux.h:349
Pseudo expression providing partial reduction operations.
Definition: ForwardDeclarations.h:212
bool isZero(const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition: CwiseNullaryOp.h:482
ColXpr col(Index i)
Definition: DenseBase.h:733
Base class for all dense matrices, vectors, and arrays.
Definition: DenseBase.h:41
Definition: DenseBase.h:162
bool all(void) const
Definition: BooleanRedux.h:79
bool allFinite() const
Definition: BooleanRedux.h:147
Helper class used by the comma initializer operator.
Definition: CommaInitializer.h:28
Definition: EigenBase.h:26
void swap(PlainObjectBase< OtherDerived > &other)
Definition: DenseBase.h:382
void reverseInPlace()
Definition: Reverse.h:217
Definition: DenseBase.h:172
bool isApproxToConstant(const Scalar &value, const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition: CwiseNullaryOp.h:298
Definition: DenseBase.h:155
Derived & setLinSpaced(Index size, const Scalar &low, const Scalar &high)
Sets a linearly space vector.
Definition: CwiseNullaryOp.h:387
Definition: DenseBase.h:108
Derived & setConstant(const Scalar &value)
Definition: CwiseNullaryOp.h:332
CommaInitializer< Derived > operator<<(const Scalar &s)
Definition: CommaInitializer.h:138
Scalar sum() const
Definition: Redux.h:360
static const CwiseNullaryOp< internal::scalar_random_op< Scalar >, Derived > Random()
Definition: Random.h:97
Dense storage base class for matrices and arrays.
Definition: PlainObjectBase.h:85
const NestByValue< Derived > nestByValue() const
Definition: NestByValue.h:104
Expression of the multiple replication of a matrix or vector.
Definition: Replicate.h:62
Index innerSize() const
Definition: DenseBase.h:203
Expression which must be nested by value.
Definition: NestByValue.h:35
Definition: DenseBase.h:167
Definition: DenseBase.h:132
internal::traits< Derived >::Index Index
The type of indices.
Definition: DenseBase.h:60
bool isConstant(const Scalar &value, const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition: CwiseNullaryOp.h:312
void transposeInPlace()
Definition: Transpose.h:292
static const ConstantReturnType Ones()
Definition: CwiseNullaryOp.h:597
Expression of a fixed-size or dynamic-size block.
Definition: Block.h:103
bool isOnes(const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition: CwiseNullaryOp.h:612
Definition: DenseBase.h:143
Eigen::Transpose< Derived > transpose()
Definition: Transpose.h:199
static const SequentialLinSpacedReturnType LinSpaced(Sequential_t, Index size, const Scalar &low, const Scalar &high)
Sets a linearly space vector.
Definition: CwiseNullaryOp.h:242
Index outerSize() const
Definition: DenseBase.h:192
static const ConstantReturnType Zero()
Definition: CwiseNullaryOp.h:468
Definition: DenseBase.h:115
const unsigned int RowMajorBit
Definition: Constants.h:53
CoeffReturnType value() const
Definition: DenseBase.h:422
const Flagged< Derived, Added, Removed > flagged() const
Definition: Flagged.h:133
const WithFormat< Derived > format(const IOFormat &fmt) const
Definition: IO.h:117
The matrix class, also used for vectors and row-vectors.
Definition: Matrix.h:127
Pseudo expression providing matrix output with given format.
Definition: IO.h:90
Expression of the reverse of a vector or matrix.
Definition: Reverse.h:70
ConstColwiseReturnType colwise() const
Definition: VectorwiseOp.h:599
Definition: DenseBase.h:102
Stores a set of parameters controlling the way matrices are printed.
Definition: IO.h:50
Definition: DenseBase.h:121
ConstRowwiseReturnType rowwise() const
Definition: VectorwiseOp.h:624
static const ConstantReturnType Constant(Index rows, Index cols, const Scalar &value)
Definition: CwiseNullaryOp.h:179
EvalReturnType eval() const
Definition: DenseBase.h:360
Expression of a coefficient wise version of the C++ ternary operator ?:
Definition: Select.h:55
const Replicate< Derived, RowFactor, ColFactor > replicate() const
Definition: Replicate.h:139