1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_ARRAY_H 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_ARRAY_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class Array 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \ingroup Core_Module 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief General-purpose arrays with easy API for coefficient-wise operations 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * The %Array class is very similar to the Matrix class. It provides 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * general-purpose one- and two-dimensional arrays. The difference between the 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * %Array and the %Matrix class is primarily in the API: the API for the 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * %Array class provides easy access to coefficient-wise operations, while the 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * API for the %Matrix class provides easy access to linear-algebra 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * operations. 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This class can be extended with the help of the plugin mechanism described on the page 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \ref TopicCustomizingEigen by defining the preprocessor symbol \c EIGEN_ARRAY_PLUGIN. 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa \ref TutorialArrayClass, \ref TopicClassHierarchy 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols> 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> > : traits<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> > 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef ArrayXpr XprKind; 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef ArrayBase<Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> > XprBase; 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols> 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass Array 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : public PlainObjectBase<Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> > 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef PlainObjectBase<Array> Base; 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_DENSE_PUBLIC_INTERFACE(Array) 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { Options = _Options }; 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename Base::PlainObject PlainObject; 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath protected: 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template <typename Derived, typename OtherDerived, bool IsVector> 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath friend struct internal::conservative_resize_like_impl; 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::m_storage; 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::base; 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::coeff; 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::coeffRef; 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * The usage of 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * using Base::operator=; 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * fails on MSVC. Since the code below is working with GCC and MSVC, we skipped 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * the usage of 'using'. This should be done only for operator=. 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Array& operator=(const EigenBase<OtherDerived> &other) 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return Base::operator=(other); 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Copies the value of the expression \a other into \c *this with automatic resizing. 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * *this might be resized to match the dimensions of \a other. If *this was a null matrix (not already initialized), 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * it will be initialized. 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Note that copying a row-vector into a vector (and conversely) is allowed. 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * The resizing, if any, is then done in the appropriate way so that row-vectors 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * remain row-vectors and vectors remain vectors. 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Array& operator=(const ArrayBase<OtherDerived>& other) 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return Base::_set(other); 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** This is a special case of the templated operator=. Its purpose is to 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * prevent a default operator= from hiding the templated operator=. 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Array& operator=(const Array& other) 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return Base::_set(other); 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Default constructor. 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * For fixed-size matrices, does nothing. 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * For dynamic-size matrices, creates an empty matrix of size 0. Does not allocate any array. Such a matrix 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * is called a null matrix. This constructor is the unique way to create null matrices: resizing 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * a matrix to 0 is not supported. 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa resize(Index,Index) 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 1107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_STRONG_INLINE Array() : Base() 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Base::_check_template_params(); 1137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_PARSED_BY_DOXYGEN 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // FIXME is it still needed ?? 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \internal */ 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Array(internal::constructor_without_unaligned_array_assert) 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : Base(internal::constructor_without_unaligned_array_assert()) 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Base::_check_template_params(); 1237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Constructs a vector or row-vector with given dimension. \only_for_vectors 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Note that this is only useful for dynamic-size vectors. For fixed-size vectors, 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * it is redundant to pass the dimension here, so it makes more sense to use the default 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * constructor Matrix() instead. 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE explicit Array(Index dim) 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : Base(dim, RowsAtCompileTime == 1 ? 1 : dim, ColsAtCompileTime == 1 ? 1 : dim) 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Base::_check_template_params(); 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_VECTOR_ONLY(Array) 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(dim >= 0); 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(SizeAtCompileTime == Dynamic || SizeAtCompileTime == dim); 1407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #ifndef EIGEN_PARSED_BY_DOXYGEN 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename T0, typename T1> 1457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_STRONG_INLINE Array(const T0& val0, const T1& val1) 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Base::_check_template_params(); 1487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez this->template _init2<T0,T1>(val0, val1); 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #else 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** constructs an uninitialized matrix with \a rows rows and \a cols columns. 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This is useful for dynamic-size matrices. For fixed-size matrices, 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * it is redundant to pass these parameters, so one should use the default constructor 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Matrix() instead. */ 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Array(Index rows, Index cols); 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** constructs an initialized 2D vector with given coefficients */ 1587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Array(const Scalar& val0, const Scalar& val1); 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #endif 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** constructs an initialized 3D vector with given coefficients */ 1627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_STRONG_INLINE Array(const Scalar& val0, const Scalar& val1, const Scalar& val2) 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Base::_check_template_params(); 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Array, 3) 1667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m_storage.data()[0] = val0; 1677faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m_storage.data()[1] = val1; 1687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m_storage.data()[2] = val2; 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** constructs an initialized 4D vector with given coefficients */ 1717faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_STRONG_INLINE Array(const Scalar& val0, const Scalar& val1, const Scalar& val2, const Scalar& val3) 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Base::_check_template_params(); 174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Array, 4) 1757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m_storage.data()[0] = val0; 1767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m_storage.data()[1] = val1; 1777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m_storage.data()[2] = val2; 1787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m_storage.data()[3] = val3; 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath explicit Array(const Scalar *data); 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Constructor copying the value of the expression \a other */ 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Array(const ArrayBase<OtherDerived>& other) 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : Base(other.rows() * other.cols(), other.rows(), other.cols()) 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Base::_check_template_params(); 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Base::_set_noalias(other); 190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Copy constructor */ 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Array(const Array& other) 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : Base(other.rows() * other.cols(), other.rows(), other.cols()) 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Base::_check_template_params(); 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Base::_set_noalias(other); 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Copy constructor with in-place evaluation */ 199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Array(const ReturnByValue<OtherDerived>& other) 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Base::_check_template_params(); 203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Base::resize(other.rows(), other.cols()); 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath other.evalTo(*this); 205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \sa MatrixBase::operator=(const EigenBase<OtherDerived>&) */ 208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Array(const EigenBase<OtherDerived> &other) 210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : Base(other.derived().rows() * other.derived().cols(), other.derived().rows(), other.derived().cols()) 211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Base::_check_template_params(); 2137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Base::_resize_to_match(other); 214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *this = other; 215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Override MatrixBase::swap() since for dynamic-sized matrices of same type it is enough to swap the 218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * data pointers. 219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void swap(ArrayBase<OtherDerived> const & other) 222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { this->_swap(other.derived()); } 223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index innerStride() const { return 1; } 225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index outerStride() const { return this->innerSize(); } 226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #ifdef EIGEN_ARRAY_PLUGIN 228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #include EIGEN_ARRAY_PLUGIN 229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #endif 230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath private: 232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename MatrixType, typename OtherDerived, bool SwapPointers> 234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath friend struct internal::matrix_swap_impl; 235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \defgroup arraytypedefs Global array typedefs 238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \ingroup Core_Module 239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Eigen defines several typedef shortcuts for most common 1D and 2D array types. 241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * The general patterns are the following: 243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \c ArrayRowsColsType where \c Rows and \c Cols can be \c 2,\c 3,\c 4 for fixed size square matrices or \c X for dynamic size, 245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * and where \c Type can be \c i for integer, \c f for float, \c d for double, \c cf for complex float, \c cd 246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * for complex double. 247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * For example, \c Array33d is a fixed-size 3x3 array type of doubles, and \c ArrayXXf is a dynamic-size matrix of floats. 249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * There are also \c ArraySizeType which are self-explanatory. For example, \c Array4cf is 251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * a fixed-size 1D array of 4 complex floats. 252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class Array 254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix) \ 257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \ingroup arraytypedefs */ \ 258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypedef Array<Type, Size, Size> Array##SizeSuffix##SizeSuffix##TypeSuffix; \ 259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \ingroup arraytypedefs */ \ 260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypedef Array<Type, Size, 1> Array##SizeSuffix##TypeSuffix; 261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, Size) \ 263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \ingroup arraytypedefs */ \ 264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypedef Array<Type, Size, Dynamic> Array##Size##X##TypeSuffix; \ 265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \ingroup arraytypedefs */ \ 266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypedef Array<Type, Dynamic, Size> Array##X##Size##TypeSuffix; 267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(Type, TypeSuffix) \ 269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 2, 2) \ 270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 3, 3) \ 271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 4, 4) \ 272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, Dynamic, X) \ 273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 2) \ 274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 3) \ 275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 4) 276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(int, i) 278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(float, f) 279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(double, d) 280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(std::complex<float>, cf) 281c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(std::complex<double>, cd) 282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#undef EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES 284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#undef EIGEN_MAKE_ARRAY_TYPEDEFS 285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#undef EIGEN_MAKE_ARRAY_TYPEDEFS_LARGE 287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, SizeSuffix) \ 289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathusing Eigen::Matrix##SizeSuffix##TypeSuffix; \ 290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathusing Eigen::Vector##SizeSuffix##TypeSuffix; \ 291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathusing Eigen::RowVector##SizeSuffix##TypeSuffix; 292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(TypeSuffix) \ 294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 2) \ 295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 3) \ 296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 4) \ 297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, X) \ 298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_USING_ARRAY_TYPEDEFS \ 300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(i) \ 301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(f) \ 302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(d) \ 303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(cf) \ 304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(cd) 305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_ARRAY_H 309