1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2007-2010 Benoit Jacob <jacob.benoit.1@gmail.com>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_DENSEBASE_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_DENSEBASE_H
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class DenseBase
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \ingroup Core_Module
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \brief Base class for all dense matrices, vectors, and arrays
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This class is the base that is inherited by all dense objects (matrix, vector, arrays,
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * and related expression types). The common Eigen API for dense objects is contained in this class.
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \tparam Derived is the derived type, e.g., a matrix type or an expression.
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This class can be extended with the help of the plugin mechanism described on the page
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \ref TopicCustomizingEigen by defining the preprocessor symbol \c EIGEN_DENSEBASE_PLUGIN.
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa \ref TopicClassHierarchy
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class DenseBase
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_PARSED_BY_DOXYGEN
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  : public internal::special_scalar_op_base<Derived,typename internal::traits<Derived>::Scalar,
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                     typename NumTraits<typename internal::traits<Derived>::Scalar>::Real>
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  : public DenseCoeffsBase<Derived>
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // not EIGEN_PARSED_BY_DOXYGEN
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using internal::special_scalar_op_base<Derived,typename internal::traits<Derived>::Scalar,
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                typename NumTraits<typename internal::traits<Derived>::Scalar>::Real>::operator*;
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    class InnerIterator;
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::traits<Derived>::StorageKind StorageKind;
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \brief The type of indices
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \details To change this, \c \#define the preprocessor symbol \c EIGEN_DEFAULT_DENSE_INDEX_TYPE.
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa \ref TopicPreprocessorDirectives.
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      */
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::traits<Derived>::Index Index;
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::traits<Derived>::Scalar Scalar;
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::packet_traits<Scalar>::type PacketScalar;
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename NumTraits<Scalar>::Real RealScalar;
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef DenseCoeffsBase<Derived> Base;
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::derived;
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::const_cast_derived;
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::rows;
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::cols;
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::size;
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::rowIndexByOuterInner;
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::colIndexByOuterInner;
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::coeff;
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::coeffByOuterInner;
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::packet;
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::packetByOuterInner;
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::writePacket;
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::writePacketByOuterInner;
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::coeffRef;
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::coeffRefByOuterInner;
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::copyCoeff;
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::copyCoeffByOuterInner;
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::copyPacket;
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::copyPacketByOuterInner;
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::operator();
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::operator[];
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::x;
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::y;
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::z;
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::w;
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::stride;
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::innerStride;
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::outerStride;
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::rowStride;
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::colStride;
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename Base::CoeffReturnType CoeffReturnType;
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    enum {
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        /**< The number of rows at compile-time. This is just a copy of the value provided
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * by the \a Derived type. If a value is not known at compile-time,
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * it is set to the \a Dynamic constant.
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * \sa MatrixBase::rows(), MatrixBase::cols(), ColsAtCompileTime, SizeAtCompileTime */
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        /**< The number of columns at compile-time. This is just a copy of the value provided
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * by the \a Derived type. If a value is not known at compile-time,
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * it is set to the \a Dynamic constant.
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * \sa MatrixBase::rows(), MatrixBase::cols(), RowsAtCompileTime, SizeAtCompileTime */
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      SizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::RowsAtCompileTime,
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                                   internal::traits<Derived>::ColsAtCompileTime>::ret),
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        /**< This is equal to the number of coefficients, i.e. the number of
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * rows times the number of columns, or to \a Dynamic if this is not
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * known at compile-time. \sa RowsAtCompileTime, ColsAtCompileTime */
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        /**< This value is equal to the maximum possible number of rows that this expression
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * might have. If this expression might have an arbitrarily high number of rows,
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * this value is set to \a Dynamic.
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          *
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * This value is useful to know when evaluating an expression, in order to determine
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * whether it is possible to avoid doing a dynamic memory allocation.
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          *
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * \sa RowsAtCompileTime, MaxColsAtCompileTime, MaxSizeAtCompileTime
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          */
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime,
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        /**< This value is equal to the maximum possible number of columns that this expression
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * might have. If this expression might have an arbitrarily high number of columns,
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * this value is set to \a Dynamic.
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          *
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * This value is useful to know when evaluating an expression, in order to determine
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * whether it is possible to avoid doing a dynamic memory allocation.
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          *
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * \sa ColsAtCompileTime, MaxRowsAtCompileTime, MaxSizeAtCompileTime
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          */
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      MaxSizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::MaxRowsAtCompileTime,
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                                      internal::traits<Derived>::MaxColsAtCompileTime>::ret),
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        /**< This value is equal to the maximum possible number of coefficients that this expression
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * might have. If this expression might have an arbitrarily high number of coefficients,
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * this value is set to \a Dynamic.
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          *
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * This value is useful to know when evaluating an expression, in order to determine
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * whether it is possible to avoid doing a dynamic memory allocation.
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          *
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * \sa SizeAtCompileTime, MaxRowsAtCompileTime, MaxColsAtCompileTime
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          */
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      IsVectorAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime == 1
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                           || internal::traits<Derived>::MaxColsAtCompileTime == 1,
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        /**< This is set to true if either the number of rows or the number of
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * columns is known at compile-time to be equal to 1. Indeed, in that case,
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * we are dealing with a column-vector (if there is only one column) or with
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * a row-vector (if there is only one row). */
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      Flags = internal::traits<Derived>::Flags,
153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        /**< This stores expression \ref flags flags which may or may not be inherited by new expressions
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * constructed from this one. See the \ref flags "list of flags".
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          */
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      IsRowMajor = int(Flags) & RowMajorBit, /**< True if this expression has row-major storage order. */
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      InnerSizeAtCompileTime = int(IsVectorAtCompileTime) ? int(SizeAtCompileTime)
160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                             : int(IsRowMajor) ? int(ColsAtCompileTime) : int(RowsAtCompileTime),
161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      CoeffReadCost = internal::traits<Derived>::CoeffReadCost,
163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        /**< This is a rough measure of how expensive it is to read one coefficient from
164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          * this expression.
165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          */
166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      InnerStrideAtCompileTime = internal::inner_stride_at_compile_time<Derived>::ret,
168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      OuterStrideAtCompileTime = internal::outer_stride_at_compile_time<Derived>::ret
169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    };
170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    enum { ThisConstantIsPrivateInPlainObjectBase };
172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns the number of nonzero coefficients which is in practice the number
174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of stored coefficients. */
175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index nonZeros() const { return size(); }
176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns true if either the number of rows or the number of columns is equal to 1.
177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * In other words, this function returns
178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \code rows()==1 || cols()==1 \endcode
179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa rows(), cols(), IsVectorAtCompileTime. */
180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns the outer size.
182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \note For a vector, this returns just 1. For a matrix (non-vector), this is the major dimension
184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * with respect to the \ref TopicStorageOrders "storage order", i.e., the number of columns for a
185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * column-major matrix, and the number of rows for a row-major matrix. */
186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Index outerSize() const
187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return IsVectorAtCompileTime ? 1
189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath           : int(IsRowMajor) ? this->rows() : this->cols();
190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns the inner size.
193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \note For a vector, this is just the size. For a matrix (non-vector), this is the minor dimension
195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * with respect to the \ref TopicStorageOrders "storage order", i.e., the number of rows for a
196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * column-major matrix, and the number of columns for a row-major matrix. */
197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Index innerSize() const
198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return IsVectorAtCompileTime ? this->size()
200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath           : int(IsRowMajor) ? this->cols() : this->rows();
201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Only plain matrices/arrays, not expressions, may be resized; therefore the only useful resize methods are
204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Matrix::resize() and Array::resize(). The present method only asserts that the new size equals the old size, and does
205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * nothing else.
206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      */
207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void resize(Index size)
208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_ONLY_USED_FOR_DEBUG(size);
210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      eigen_assert(size == this->size()
211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                && "DenseBase::resize() does not actually allow to resize.");
212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Only plain matrices/arrays, not expressions, may be resized; therefore the only useful resize methods are
214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Matrix::resize() and Array::resize(). The present method only asserts that the new size equals the old size, and does
215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * nothing else.
216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      */
217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void resize(Index rows, Index cols)
218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_ONLY_USED_FOR_DEBUG(rows);
220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_ONLY_USED_FOR_DEBUG(cols);
221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      eigen_assert(rows == this->rows() && cols == this->cols()
222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                && "DenseBase::resize() does not actually allow to resize.");
223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_PARSED_BY_DOXYGEN
226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal Represents a matrix with all coefficients equal to one another*/
228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>,Derived> ConstantReturnType;
229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal Represents a vector with linearly spaced coefficients that allows sequential access only. */
230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef CwiseNullaryOp<internal::linspaced_op<Scalar,false>,Derived> SequentialLinSpacedReturnType;
231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal Represents a vector with linearly spaced coefficients that allows random access. */
232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef CwiseNullaryOp<internal::linspaced_op<Scalar,true>,Derived> RandomAccessLinSpacedReturnType;
233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal the return type of MatrixBase::eigenvalues() */
234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Matrix<typename NumTraits<typename internal::traits<Derived>::Scalar>::Real, internal::traits<Derived>::ColsAtCompileTime, 1> EigenvaluesReturnType;
235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // not EIGEN_PARSED_BY_DOXYGEN
237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Copies \a other into *this. \returns a reference to *this. */
239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& operator=(const DenseBase<OtherDerived>& other);
241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Special case of the template operator=, in order to prevent the compiler
243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * from generating a default operator= (issue hit with g++ 4.1)
244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      */
245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& operator=(const DenseBase& other);
246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& operator=(const EigenBase<OtherDerived> &other);
249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& operator+=(const EigenBase<OtherDerived> &other);
252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& operator-=(const EigenBase<OtherDerived> &other);
255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& operator=(const ReturnByValue<OtherDerived>& func);
258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_PARSED_BY_DOXYGEN
260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Copies \a other into *this without evaluating other. \returns a reference to *this. */
261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& lazyAssign(const DenseBase<OtherDerived>& other);
263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // not EIGEN_PARSED_BY_DOXYGEN
264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CommaInitializer<Derived> operator<< (const Scalar& s);
266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<unsigned int Added,unsigned int Removed>
268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Flagged<Derived, Added, Removed> flagged() const;
269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CommaInitializer<Derived> operator<< (const DenseBase<OtherDerived>& other);
272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Eigen::Transpose<Derived> transpose();
274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef const Transpose<const Derived> ConstTransposeReturnType;
275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ConstTransposeReturnType transpose() const;
276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void transposeInPlace();
277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_NO_DEBUG
278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void checkTransposeAliasing(const OtherDerived& other) const;
281c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef VectorBlock<Derived> SegmentReturnType;
285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef const VectorBlock<const Derived> ConstSegmentReturnType;
286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int Size> struct FixedSegmentReturnType { typedef VectorBlock<Derived, Size> Type; };
287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int Size> struct ConstFixedSegmentReturnType { typedef const VectorBlock<const Derived, Size> Type; };
288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // Note: The "DenseBase::" prefixes are added to help MSVC9 to match these declarations with the later implementations.
290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    SegmentReturnType segment(Index start, Index size);
291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typename DenseBase::ConstSegmentReturnType segment(Index start, Index size) const;
292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    SegmentReturnType head(Index size);
294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typename DenseBase::ConstSegmentReturnType head(Index size) const;
295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    SegmentReturnType tail(Index size);
297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typename DenseBase::ConstSegmentReturnType tail(Index size) const;
298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int Size> typename FixedSegmentReturnType<Size>::Type head();
300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int Size> typename ConstFixedSegmentReturnType<Size>::Type head() const;
301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int Size> typename FixedSegmentReturnType<Size>::Type tail();
303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int Size> typename ConstFixedSegmentReturnType<Size>::Type tail() const;
304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int Size> typename FixedSegmentReturnType<Size>::Type segment(Index start);
306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int Size> typename ConstFixedSegmentReturnType<Size>::Type segment(Index start) const;
307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const ConstantReturnType
309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Constant(Index rows, Index cols, const Scalar& value);
310c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const ConstantReturnType
311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Constant(Index size, const Scalar& value);
312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const ConstantReturnType
313c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Constant(const Scalar& value);
314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const SequentialLinSpacedReturnType
316c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    LinSpaced(Sequential_t, Index size, const Scalar& low, const Scalar& high);
317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const RandomAccessLinSpacedReturnType
318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    LinSpaced(Index size, const Scalar& low, const Scalar& high);
319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const SequentialLinSpacedReturnType
320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    LinSpaced(Sequential_t, const Scalar& low, const Scalar& high);
321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const RandomAccessLinSpacedReturnType
322c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    LinSpaced(const Scalar& low, const Scalar& high);
323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
324c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename CustomNullaryOp>
325c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const CwiseNullaryOp<CustomNullaryOp, Derived>
326c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    NullaryExpr(Index rows, Index cols, const CustomNullaryOp& func);
327c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename CustomNullaryOp>
328c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const CwiseNullaryOp<CustomNullaryOp, Derived>
329c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    NullaryExpr(Index size, const CustomNullaryOp& func);
330c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename CustomNullaryOp>
331c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const CwiseNullaryOp<CustomNullaryOp, Derived>
332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    NullaryExpr(const CustomNullaryOp& func);
333c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const ConstantReturnType Zero(Index rows, Index cols);
335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const ConstantReturnType Zero(Index size);
336c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const ConstantReturnType Zero();
337c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const ConstantReturnType Ones(Index rows, Index cols);
338c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const ConstantReturnType Ones(Index size);
339c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const ConstantReturnType Ones();
340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
341c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void fill(const Scalar& value);
342c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& setConstant(const Scalar& value);
343c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& setLinSpaced(Index size, const Scalar& low, const Scalar& high);
344c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& setLinSpaced(const Scalar& low, const Scalar& high);
345c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& setZero();
346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& setOnes();
347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& setRandom();
348c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    bool isApprox(const DenseBase<OtherDerived>& other,
351c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  RealScalar prec = NumTraits<Scalar>::dummy_precision()) const;
352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    bool isMuchSmallerThan(const RealScalar& other,
353c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                           RealScalar prec = NumTraits<Scalar>::dummy_precision()) const;
354c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
355c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    bool isMuchSmallerThan(const DenseBase<OtherDerived>& other,
356c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                           RealScalar prec = NumTraits<Scalar>::dummy_precision()) const;
357c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
358c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    bool isApproxToConstant(const Scalar& value, RealScalar prec = NumTraits<Scalar>::dummy_precision()) const;
359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    bool isConstant(const Scalar& value, RealScalar prec = NumTraits<Scalar>::dummy_precision()) const;
360c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    bool isZero(RealScalar prec = NumTraits<Scalar>::dummy_precision()) const;
361c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    bool isOnes(RealScalar prec = NumTraits<Scalar>::dummy_precision()) const;
362c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
363c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Derived& operator*=(const Scalar& other);
364c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Derived& operator/=(const Scalar& other);
365c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
366c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::add_const_on_value_type<typename internal::eval<Derived>::type>::type EvalReturnType;
367c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns the matrix or vector obtained by evaluating this expression.
368c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
369c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Notice that in the case of a plain matrix or vector (not an expression) this function just returns
370c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * a const reference, in order to avoid a useless copy.
371c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      */
372c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_STRONG_INLINE EvalReturnType eval() const
373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
374c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      // Even though MSVC does not honor strong inlining when the return type
375c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      // is a dynamic matrix, we desperately need strong inlining for fixed
376c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      // size types on MSVC.
377c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return typename internal::eval<Derived>::type(derived());
378c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** swaps *this with the expression \a other.
381c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
382c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      */
383c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
384c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void swap(const DenseBase<OtherDerived>& other,
385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath              int = OtherDerived::ThisConstantIsPrivateInPlainObjectBase)
386c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
387c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      SwapWrapper<Derived>(derived()).lazyAssign(other.derived());
388c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
389c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
390c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** swaps *this with the matrix or array \a other.
391c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
392c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      */
393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void swap(PlainObjectBase<OtherDerived>& other)
395c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
396c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      SwapWrapper<Derived>(derived()).lazyAssign(other.derived());
397c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
398c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
399c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
400c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const NestByValue<Derived> nestByValue() const;
401c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const ForceAlignedAccess<Derived> forceAlignedAccess() const;
402c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline ForceAlignedAccess<Derived> forceAlignedAccess();
403c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<bool Enable> inline const typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type forceAlignedAccessIf() const;
404c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<bool Enable> inline typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type forceAlignedAccessIf();
405c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
406c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Scalar sum() const;
407c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Scalar mean() const;
408c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Scalar trace() const;
409c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
410c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Scalar prod() const;
411c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
412c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typename internal::traits<Derived>::Scalar minCoeff() const;
413c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typename internal::traits<Derived>::Scalar maxCoeff() const;
414c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
415c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename IndexType>
416c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typename internal::traits<Derived>::Scalar minCoeff(IndexType* row, IndexType* col) const;
417c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename IndexType>
418c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typename internal::traits<Derived>::Scalar maxCoeff(IndexType* row, IndexType* col) const;
419c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename IndexType>
420c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typename internal::traits<Derived>::Scalar minCoeff(IndexType* index) const;
421c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename IndexType>
422c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typename internal::traits<Derived>::Scalar maxCoeff(IndexType* index) const;
423c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
424c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename BinaryOp>
425c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typename internal::result_of<BinaryOp(typename internal::traits<Derived>::Scalar)>::type
426c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    redux(const BinaryOp& func) const;
427c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
428c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename Visitor>
429c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void visit(Visitor& func) const;
430c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
431c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const WithFormat<Derived> format(const IOFormat& fmt) const;
432c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
433c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns the unique coefficient of a 1x1 expression */
434c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CoeffReturnType value() const
435c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
436c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SIZE_1x1(Derived)
437c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      eigen_assert(this->rows() == 1 && this->cols() == 1);
438c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return derived().coeff(0,0);
439c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
440c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
441c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/////////// Array module ///////////
442c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
443c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    bool all(void) const;
444c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    bool any(void) const;
445c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Index count() const;
446c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
447c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef VectorwiseOp<Derived, Horizontal> RowwiseReturnType;
448c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef const VectorwiseOp<const Derived, Horizontal> ConstRowwiseReturnType;
449c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef VectorwiseOp<Derived, Vertical> ColwiseReturnType;
450c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef const VectorwiseOp<const Derived, Vertical> ConstColwiseReturnType;
451c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
452c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ConstRowwiseReturnType rowwise() const;
453c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    RowwiseReturnType rowwise();
454c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ConstColwiseReturnType colwise() const;
455c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ColwiseReturnType colwise();
456c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
457c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const CwiseNullaryOp<internal::scalar_random_op<Scalar>,Derived> Random(Index rows, Index cols);
458c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const CwiseNullaryOp<internal::scalar_random_op<Scalar>,Derived> Random(Index size);
459c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const CwiseNullaryOp<internal::scalar_random_op<Scalar>,Derived> Random();
460c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
461c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename ThenDerived,typename ElseDerived>
462c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Select<Derived,ThenDerived,ElseDerived>
463c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    select(const DenseBase<ThenDerived>& thenMatrix,
464c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath           const DenseBase<ElseDerived>& elseMatrix) const;
465c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
466c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename ThenDerived>
467c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const Select<Derived,ThenDerived, typename ThenDerived::ConstantReturnType>
468c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    select(const DenseBase<ThenDerived>& thenMatrix, typename ThenDerived::Scalar elseScalar) const;
469c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
470c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename ElseDerived>
471c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const Select<Derived, typename ElseDerived::ConstantReturnType, ElseDerived >
472c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    select(typename ElseDerived::Scalar thenScalar, const DenseBase<ElseDerived>& elseMatrix) const;
473c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
474c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int p> RealScalar lpNorm() const;
475c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
476c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int RowFactor, int ColFactor>
477c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Replicate<Derived,RowFactor,ColFactor> replicate() const;
478c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Replicate<Derived,Dynamic,Dynamic> replicate(Index rowFacor,Index colFactor) const;
479c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
480c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Reverse<Derived, BothDirections> ReverseReturnType;
481c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef const Reverse<const Derived, BothDirections> ConstReverseReturnType;
482c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ReverseReturnType reverse();
483c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ConstReverseReturnType reverse() const;
484c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void reverseInPlace();
485c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
486c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::DenseBase
487c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#   include "../plugins/BlockMethods.h"
488c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#   ifdef EIGEN_DENSEBASE_PLUGIN
489c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#     include EIGEN_DENSEBASE_PLUGIN
490c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#   endif
491c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#undef EIGEN_CURRENT_STORAGE_BASE_CLASS
492c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
493c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN2_SUPPORT
494c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
495c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Block<Derived> corner(CornerType type, Index cRows, Index cCols);
496c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Block<Derived> corner(CornerType type, Index cRows, Index cCols) const;
497c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int CRows, int CCols>
498c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Block<Derived, CRows, CCols> corner(CornerType type);
499c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int CRows, int CCols>
500c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Block<Derived, CRows, CCols> corner(CornerType type) const;
501c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
502c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN2_SUPPORT
503c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
504c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
505c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // disable the use of evalTo for dense objects with a nice compilation error
506c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename Dest> inline void evalTo(Dest& ) const
507c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
508c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT((internal::is_same<Dest,void>::value),THE_EVAL_EVALTO_FUNCTION_SHOULD_NEVER_BE_CALLED_FOR_DENSE_OBJECTS);
509c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
510c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
511c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
512c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Default constructor. Do nothing. */
513c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    DenseBase()
514c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
515c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      /* Just checks for self-consistency of the flags.
516c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath       * Only do it when debugging Eigen, as this borders on paranoiac and could slow compilation down
517c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath       */
518c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN_INTERNAL_DEBUGGING
519c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT((EIGEN_IMPLIES(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, int(IsRowMajor))
520c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                        && EIGEN_IMPLIES(MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1, int(!IsRowMajor))),
521c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          INVALID_STORAGE_ORDER_FOR_THIS_VECTOR_EXPRESSION)
522c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
523c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
524c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
525c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  private:
526c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    explicit DenseBase(int);
527c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    DenseBase(int,int);
528c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived> explicit DenseBase(const DenseBase<OtherDerived>&);
529c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
530c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
531c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
532c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
533c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_DENSEBASE_H
534