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