| 1 | // This file is part of Eigen, a lightweight C++ template library | 
|---|
| 2 | // for linear algebra. | 
|---|
| 3 | // | 
|---|
| 4 | // Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com> | 
|---|
| 5 | // Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr> | 
|---|
| 6 | // | 
|---|
| 7 | // This Source Code Form is subject to the terms of the Mozilla | 
|---|
| 8 | // Public License v. 2.0. If a copy of the MPL was not distributed | 
|---|
| 9 | // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. | 
|---|
| 10 |  | 
|---|
| 11 | #ifndef EIGEN_MATRIX_H | 
|---|
| 12 | #define EIGEN_MATRIX_H | 
|---|
| 13 |  | 
|---|
| 14 | namespace Eigen { | 
|---|
| 15 |  | 
|---|
| 16 | namespace internal { | 
|---|
| 17 | template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols> | 
|---|
| 18 | struct traits<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> > | 
|---|
| 19 | { | 
|---|
| 20 | private: | 
|---|
| 21 | enum { size = internal::size_at_compile_time<_Rows,_Cols>::ret }; | 
|---|
| 22 | typedef typename find_best_packet<_Scalar,size>::type PacketScalar; | 
|---|
| 23 | enum { | 
|---|
| 24 | row_major_bit = _Options&RowMajor ? RowMajorBit : 0, | 
|---|
| 25 | is_dynamic_size_storage = _MaxRows==Dynamic || _MaxCols==Dynamic, | 
|---|
| 26 | max_size = is_dynamic_size_storage ? Dynamic : _MaxRows*_MaxCols, | 
|---|
| 27 | default_alignment = compute_default_alignment<_Scalar,max_size>::value, | 
|---|
| 28 | actual_alignment = ((_Options&DontAlign)==0) ? default_alignment : 0, | 
|---|
| 29 | required_alignment = unpacket_traits<PacketScalar>::alignment, | 
|---|
| 30 | packet_access_bit = (packet_traits<_Scalar>::Vectorizable && (EIGEN_UNALIGNED_VECTORIZE || (actual_alignment>=required_alignment))) ? PacketAccessBit : 0 | 
|---|
| 31 | }; | 
|---|
| 32 |  | 
|---|
| 33 | public: | 
|---|
| 34 | typedef _Scalar Scalar; | 
|---|
| 35 | typedef Dense StorageKind; | 
|---|
| 36 | typedef Eigen::Index StorageIndex; | 
|---|
| 37 | typedef MatrixXpr XprKind; | 
|---|
| 38 | enum { | 
|---|
| 39 | RowsAtCompileTime = _Rows, | 
|---|
| 40 | ColsAtCompileTime = _Cols, | 
|---|
| 41 | MaxRowsAtCompileTime = _MaxRows, | 
|---|
| 42 | MaxColsAtCompileTime = _MaxCols, | 
|---|
| 43 | Flags = compute_matrix_flags<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::ret, | 
|---|
| 44 | Options = _Options, | 
|---|
| 45 | InnerStrideAtCompileTime = 1, | 
|---|
| 46 | OuterStrideAtCompileTime = (Options&RowMajor) ? ColsAtCompileTime : RowsAtCompileTime, | 
|---|
| 47 |  | 
|---|
| 48 | // FIXME, the following flag in only used to define NeedsToAlign in PlainObjectBase | 
|---|
| 49 | EvaluatorFlags = LinearAccessBit | DirectAccessBit | packet_access_bit | row_major_bit, | 
|---|
| 50 | Alignment = actual_alignment | 
|---|
| 51 | }; | 
|---|
| 52 | }; | 
|---|
| 53 | } | 
|---|
| 54 |  | 
|---|
| 55 | /** \class Matrix | 
|---|
| 56 | * \ingroup Core_Module | 
|---|
| 57 | * | 
|---|
| 58 | * \brief The matrix class, also used for vectors and row-vectors | 
|---|
| 59 | * | 
|---|
| 60 | * The %Matrix class is the work-horse for all \em dense (\ref dense "note") matrices and vectors within Eigen. | 
|---|
| 61 | * Vectors are matrices with one column, and row-vectors are matrices with one row. | 
|---|
| 62 | * | 
|---|
| 63 | * The %Matrix class encompasses \em both fixed-size and dynamic-size objects (\ref fixedsize "note"). | 
|---|
| 64 | * | 
|---|
| 65 | * The first three template parameters are required: | 
|---|
| 66 | * \tparam _Scalar Numeric type, e.g. float, double, int or std::complex<float>. | 
|---|
| 67 | *                 User defined scalar types are supported as well (see \ref user_defined_scalars "here"). | 
|---|
| 68 | * \tparam _Rows Number of rows, or \b Dynamic | 
|---|
| 69 | * \tparam _Cols Number of columns, or \b Dynamic | 
|---|
| 70 | * | 
|---|
| 71 | * The remaining template parameters are optional -- in most cases you don't have to worry about them. | 
|---|
| 72 | * \tparam _Options A combination of either \b #RowMajor or \b #ColMajor, and of either | 
|---|
| 73 | *                 \b #AutoAlign or \b #DontAlign. | 
|---|
| 74 | *                 The former controls \ref TopicStorageOrders "storage order", and defaults to column-major. The latter controls alignment, which is required | 
|---|
| 75 | *                 for vectorization. It defaults to aligning matrices except for fixed sizes that aren't a multiple of the packet size. | 
|---|
| 76 | * \tparam _MaxRows Maximum number of rows. Defaults to \a _Rows (\ref maxrows "note"). | 
|---|
| 77 | * \tparam _MaxCols Maximum number of columns. Defaults to \a _Cols (\ref maxrows "note"). | 
|---|
| 78 | * | 
|---|
| 79 | * Eigen provides a number of typedefs covering the usual cases. Here are some examples: | 
|---|
| 80 | * | 
|---|
| 81 | * \li \c Matrix2d is a 2x2 square matrix of doubles (\c Matrix<double, 2, 2>) | 
|---|
| 82 | * \li \c Vector4f is a vector of 4 floats (\c Matrix<float, 4, 1>) | 
|---|
| 83 | * \li \c RowVector3i is a row-vector of 3 ints (\c Matrix<int, 1, 3>) | 
|---|
| 84 | * | 
|---|
| 85 | * \li \c MatrixXf is a dynamic-size matrix of floats (\c Matrix<float, Dynamic, Dynamic>) | 
|---|
| 86 | * \li \c VectorXf is a dynamic-size vector of floats (\c Matrix<float, Dynamic, 1>) | 
|---|
| 87 | * | 
|---|
| 88 | * \li \c Matrix2Xf is a partially fixed-size (dynamic-size) matrix of floats (\c Matrix<float, 2, Dynamic>) | 
|---|
| 89 | * \li \c MatrixX3d is a partially dynamic-size (fixed-size) matrix of double (\c Matrix<double, Dynamic, 3>) | 
|---|
| 90 | * | 
|---|
| 91 | * See \link matrixtypedefs this page \endlink for a complete list of predefined \em %Matrix and \em Vector typedefs. | 
|---|
| 92 | * | 
|---|
| 93 | * You can access elements of vectors and matrices using normal subscripting: | 
|---|
| 94 | * | 
|---|
| 95 | * \code | 
|---|
| 96 | * Eigen::VectorXd v(10); | 
|---|
| 97 | * v[0] = 0.1; | 
|---|
| 98 | * v[1] = 0.2; | 
|---|
| 99 | * v(0) = 0.3; | 
|---|
| 100 | * v(1) = 0.4; | 
|---|
| 101 | * | 
|---|
| 102 | * Eigen::MatrixXi m(10, 10); | 
|---|
| 103 | * m(0, 1) = 1; | 
|---|
| 104 | * m(0, 2) = 2; | 
|---|
| 105 | * m(0, 3) = 3; | 
|---|
| 106 | * \endcode | 
|---|
| 107 | * | 
|---|
| 108 | * This class can be extended with the help of the plugin mechanism described on the page | 
|---|
| 109 | * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_MATRIX_PLUGIN. | 
|---|
| 110 | * | 
|---|
| 111 | * <i><b>Some notes:</b></i> | 
|---|
| 112 | * | 
|---|
| 113 | * <dl> | 
|---|
| 114 | * <dt><b>\anchor dense Dense versus sparse:</b></dt> | 
|---|
| 115 | * <dd>This %Matrix class handles dense, not sparse matrices and vectors. For sparse matrices and vectors, see the Sparse module. | 
|---|
| 116 | * | 
|---|
| 117 | * Dense matrices and vectors are plain usual arrays of coefficients. All the coefficients are stored, in an ordinary contiguous array. | 
|---|
| 118 | * This is unlike Sparse matrices and vectors where the coefficients are stored as a list of nonzero coefficients.</dd> | 
|---|
| 119 | * | 
|---|
| 120 | * <dt><b>\anchor fixedsize Fixed-size versus dynamic-size:</b></dt> | 
|---|
| 121 | * <dd>Fixed-size means that the numbers of rows and columns are known are compile-time. In this case, Eigen allocates the array | 
|---|
| 122 | * of coefficients as a fixed-size array, as a class member. This makes sense for very small matrices, typically up to 4x4, sometimes up | 
|---|
| 123 | * to 16x16. Larger matrices should be declared as dynamic-size even if one happens to know their size at compile-time. | 
|---|
| 124 | * | 
|---|
| 125 | * Dynamic-size means that the numbers of rows or columns are not necessarily known at compile-time. In this case they are runtime | 
|---|
| 126 | * variables, and the array of coefficients is allocated dynamically on the heap. | 
|---|
| 127 | * | 
|---|
| 128 | * Note that \em dense matrices, be they Fixed-size or Dynamic-size, <em>do not</em> expand dynamically in the sense of a std::map. | 
|---|
| 129 | * If you want this behavior, see the Sparse module.</dd> | 
|---|
| 130 | * | 
|---|
| 131 | * <dt><b>\anchor maxrows _MaxRows and _MaxCols:</b></dt> | 
|---|
| 132 | * <dd>In most cases, one just leaves these parameters to the default values. | 
|---|
| 133 | * These parameters mean the maximum size of rows and columns that the matrix may have. They are useful in cases | 
|---|
| 134 | * when the exact numbers of rows and columns are not known are compile-time, but it is known at compile-time that they cannot | 
|---|
| 135 | * exceed a certain value. This happens when taking dynamic-size blocks inside fixed-size matrices: in this case _MaxRows and _MaxCols | 
|---|
| 136 | * are the dimensions of the original matrix, while _Rows and _Cols are Dynamic.</dd> | 
|---|
| 137 | * </dl> | 
|---|
| 138 | * | 
|---|
| 139 | * <i><b>ABI and storage layout</b></i> | 
|---|
| 140 | * | 
|---|
| 141 | * The table below summarizes the ABI of some possible Matrix instances which is fixed thorough the lifetime of Eigen 3. | 
|---|
| 142 | * <table  class="manual"> | 
|---|
| 143 | * <tr><th>Matrix type</th><th>Equivalent C structure</th></tr> | 
|---|
| 144 | * <tr><td>\code Matrix<T,Dynamic,Dynamic> \endcode</td><td>\code | 
|---|
| 145 | * struct { | 
|---|
| 146 | *   T *data;                  // with (size_t(data)%EIGEN_MAX_ALIGN_BYTES)==0 | 
|---|
| 147 | *   Eigen::Index rows, cols; | 
|---|
| 148 | *  }; | 
|---|
| 149 | * \endcode</td></tr> | 
|---|
| 150 | * <tr class="alt"><td>\code | 
|---|
| 151 | * Matrix<T,Dynamic,1> | 
|---|
| 152 | * Matrix<T,1,Dynamic> \endcode</td><td>\code | 
|---|
| 153 | * struct { | 
|---|
| 154 | *   T *data;                  // with (size_t(data)%EIGEN_MAX_ALIGN_BYTES)==0 | 
|---|
| 155 | *   Eigen::Index size; | 
|---|
| 156 | *  }; | 
|---|
| 157 | * \endcode</td></tr> | 
|---|
| 158 | * <tr><td>\code Matrix<T,Rows,Cols> \endcode</td><td>\code | 
|---|
| 159 | * struct { | 
|---|
| 160 | *   T data[Rows*Cols];        // with (size_t(data)%A(Rows*Cols*sizeof(T)))==0 | 
|---|
| 161 | *  }; | 
|---|
| 162 | * \endcode</td></tr> | 
|---|
| 163 | * <tr class="alt"><td>\code Matrix<T,Dynamic,Dynamic,0,MaxRows,MaxCols> \endcode</td><td>\code | 
|---|
| 164 | * struct { | 
|---|
| 165 | *   T data[MaxRows*MaxCols];  // with (size_t(data)%A(MaxRows*MaxCols*sizeof(T)))==0 | 
|---|
| 166 | *   Eigen::Index rows, cols; | 
|---|
| 167 | *  }; | 
|---|
| 168 | * \endcode</td></tr> | 
|---|
| 169 | * </table> | 
|---|
| 170 | * Note that in this table Rows, Cols, MaxRows and MaxCols are all positive integers. A(S) is defined to the largest possible power-of-two | 
|---|
| 171 | * smaller to EIGEN_MAX_STATIC_ALIGN_BYTES. | 
|---|
| 172 | * | 
|---|
| 173 | * \see MatrixBase for the majority of the API methods for matrices, \ref TopicClassHierarchy, | 
|---|
| 174 | * \ref TopicStorageOrders | 
|---|
| 175 | */ | 
|---|
| 176 |  | 
|---|
| 177 | template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols> | 
|---|
| 178 | class Matrix | 
|---|
| 179 | : public PlainObjectBase<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> > | 
|---|
| 180 | { | 
|---|
| 181 | public: | 
|---|
| 182 |  | 
|---|
| 183 | /** \brief Base class typedef. | 
|---|
| 184 | * \sa PlainObjectBase | 
|---|
| 185 | */ | 
|---|
| 186 | typedef PlainObjectBase<Matrix> Base; | 
|---|
| 187 |  | 
|---|
| 188 | enum { Options = _Options }; | 
|---|
| 189 |  | 
|---|
| 190 | EIGEN_DENSE_PUBLIC_INTERFACE(Matrix) | 
|---|
| 191 |  | 
|---|
| 192 | typedef typename Base::PlainObject PlainObject; | 
|---|
| 193 |  | 
|---|
| 194 | using Base::base; | 
|---|
| 195 | using Base::coeffRef; | 
|---|
| 196 |  | 
|---|
| 197 | /** | 
|---|
| 198 | * \brief Assigns matrices to each other. | 
|---|
| 199 | * | 
|---|
| 200 | * \note This is a special case of the templated operator=. Its purpose is | 
|---|
| 201 | * to prevent a default operator= from hiding the templated operator=. | 
|---|
| 202 | * | 
|---|
| 203 | * \callgraph | 
|---|
| 204 | */ | 
|---|
| 205 | EIGEN_DEVICE_FUNC | 
|---|
| 206 | EIGEN_STRONG_INLINE Matrix& operator=(const Matrix& other) | 
|---|
| 207 | { | 
|---|
| 208 | return Base::_set(other); | 
|---|
| 209 | } | 
|---|
| 210 |  | 
|---|
| 211 | /** \internal | 
|---|
| 212 | * \brief Copies the value of the expression \a other into \c *this with automatic resizing. | 
|---|
| 213 | * | 
|---|
| 214 | * *this might be resized to match the dimensions of \a other. If *this was a null matrix (not already initialized), | 
|---|
| 215 | * it will be initialized. | 
|---|
| 216 | * | 
|---|
| 217 | * Note that copying a row-vector into a vector (and conversely) is allowed. | 
|---|
| 218 | * The resizing, if any, is then done in the appropriate way so that row-vectors | 
|---|
| 219 | * remain row-vectors and vectors remain vectors. | 
|---|
| 220 | */ | 
|---|
| 221 | template<typename OtherDerived> | 
|---|
| 222 | EIGEN_DEVICE_FUNC | 
|---|
| 223 | EIGEN_STRONG_INLINE Matrix& operator=(const DenseBase<OtherDerived>& other) | 
|---|
| 224 | { | 
|---|
| 225 | return Base::_set(other); | 
|---|
| 226 | } | 
|---|
| 227 |  | 
|---|
| 228 | /* Here, doxygen failed to copy the brief information when using \copydoc */ | 
|---|
| 229 |  | 
|---|
| 230 | /** | 
|---|
| 231 | * \brief Copies the generic expression \a other into *this. | 
|---|
| 232 | * \copydetails DenseBase::operator=(const EigenBase<OtherDerived> &other) | 
|---|
| 233 | */ | 
|---|
| 234 | template<typename OtherDerived> | 
|---|
| 235 | EIGEN_DEVICE_FUNC | 
|---|
| 236 | EIGEN_STRONG_INLINE Matrix& operator=(const EigenBase<OtherDerived> &other) | 
|---|
| 237 | { | 
|---|
| 238 | return Base::operator=(other); | 
|---|
| 239 | } | 
|---|
| 240 |  | 
|---|
| 241 | template<typename OtherDerived> | 
|---|
| 242 | EIGEN_DEVICE_FUNC | 
|---|
| 243 | EIGEN_STRONG_INLINE Matrix& operator=(const ReturnByValue<OtherDerived>& func) | 
|---|
| 244 | { | 
|---|
| 245 | return Base::operator=(func); | 
|---|
| 246 | } | 
|---|
| 247 |  | 
|---|
| 248 | /** \brief Default constructor. | 
|---|
| 249 | * | 
|---|
| 250 | * For fixed-size matrices, does nothing. | 
|---|
| 251 | * | 
|---|
| 252 | * For dynamic-size matrices, creates an empty matrix of size 0. Does not allocate any array. Such a matrix | 
|---|
| 253 | * is called a null matrix. This constructor is the unique way to create null matrices: resizing | 
|---|
| 254 | * a matrix to 0 is not supported. | 
|---|
| 255 | * | 
|---|
| 256 | * \sa resize(Index,Index) | 
|---|
| 257 | */ | 
|---|
| 258 | EIGEN_DEVICE_FUNC | 
|---|
| 259 | EIGEN_STRONG_INLINE Matrix() : Base() | 
|---|
| 260 | { | 
|---|
| 261 | Base::_check_template_params(); | 
|---|
| 262 | EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED | 
|---|
| 263 | } | 
|---|
| 264 |  | 
|---|
| 265 | // FIXME is it still needed | 
|---|
| 266 | EIGEN_DEVICE_FUNC | 
|---|
| 267 | explicit Matrix(internal::constructor_without_unaligned_array_assert) | 
|---|
| 268 | : Base(internal::constructor_without_unaligned_array_assert()) | 
|---|
| 269 | { Base::_check_template_params(); EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED } | 
|---|
| 270 |  | 
|---|
| 271 | #if EIGEN_HAS_RVALUE_REFERENCES | 
|---|
| 272 | EIGEN_DEVICE_FUNC | 
|---|
| 273 | Matrix(Matrix&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_constructible<Scalar>::value) | 
|---|
| 274 | : Base(std::move(other)) | 
|---|
| 275 | { | 
|---|
| 276 | Base::_check_template_params(); | 
|---|
| 277 | } | 
|---|
| 278 | EIGEN_DEVICE_FUNC | 
|---|
| 279 | Matrix& operator=(Matrix&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_assignable<Scalar>::value) | 
|---|
| 280 | { | 
|---|
| 281 | other.swap(*this); | 
|---|
| 282 | return *this; | 
|---|
| 283 | } | 
|---|
| 284 | #endif | 
|---|
| 285 |  | 
|---|
| 286 | #ifndef EIGEN_PARSED_BY_DOXYGEN | 
|---|
| 287 |  | 
|---|
| 288 | // This constructor is for both 1x1 matrices and dynamic vectors | 
|---|
| 289 | template<typename T> | 
|---|
| 290 | EIGEN_DEVICE_FUNC | 
|---|
| 291 | EIGEN_STRONG_INLINE explicit Matrix(const T& x) | 
|---|
| 292 | { | 
|---|
| 293 | Base::_check_template_params(); | 
|---|
| 294 | Base::template _init1<T>(x); | 
|---|
| 295 | } | 
|---|
| 296 |  | 
|---|
| 297 | template<typename T0, typename T1> | 
|---|
| 298 | EIGEN_DEVICE_FUNC | 
|---|
| 299 | EIGEN_STRONG_INLINE Matrix(const T0& x, const T1& y) | 
|---|
| 300 | { | 
|---|
| 301 | Base::_check_template_params(); | 
|---|
| 302 | Base::template _init2<T0,T1>(x, y); | 
|---|
| 303 | } | 
|---|
| 304 | #else | 
|---|
| 305 | /** \brief Constructs a fixed-sized matrix initialized with coefficients starting at \a data */ | 
|---|
| 306 | EIGEN_DEVICE_FUNC | 
|---|
| 307 | explicit Matrix(const Scalar *data); | 
|---|
| 308 |  | 
|---|
| 309 | /** \brief Constructs a vector or row-vector with given dimension. \only_for_vectors | 
|---|
| 310 | * | 
|---|
| 311 | * This is useful for dynamic-size vectors. For fixed-size vectors, | 
|---|
| 312 | * it is redundant to pass these parameters, so one should use the default constructor | 
|---|
| 313 | * Matrix() instead. | 
|---|
| 314 | * | 
|---|
| 315 | * \warning This constructor is disabled for fixed-size \c 1x1 matrices. For instance, | 
|---|
| 316 | * calling Matrix<double,1,1>(1) will call the initialization constructor: Matrix(const Scalar&). | 
|---|
| 317 | * For fixed-size \c 1x1 matrices it is therefore recommended to use the default | 
|---|
| 318 | * constructor Matrix() instead, especially when using one of the non standard | 
|---|
| 319 | * \c EIGEN_INITIALIZE_MATRICES_BY_{ZERO,\c NAN} macros (see \ref TopicPreprocessorDirectives). | 
|---|
| 320 | */ | 
|---|
| 321 | EIGEN_STRONG_INLINE explicit Matrix(Index dim); | 
|---|
| 322 | /** \brief Constructs an initialized 1x1 matrix with the given coefficient */ | 
|---|
| 323 | Matrix(const Scalar& x); | 
|---|
| 324 | /** \brief Constructs an uninitialized matrix with \a rows rows and \a cols columns. | 
|---|
| 325 | * | 
|---|
| 326 | * This is useful for dynamic-size matrices. For fixed-size matrices, | 
|---|
| 327 | * it is redundant to pass these parameters, so one should use the default constructor | 
|---|
| 328 | * Matrix() instead. | 
|---|
| 329 | * | 
|---|
| 330 | * \warning This constructor is disabled for fixed-size \c 1x2 and \c 2x1 vectors. For instance, | 
|---|
| 331 | * calling Matrix2f(2,1) will call the initialization constructor: Matrix(const Scalar& x, const Scalar& y). | 
|---|
| 332 | * For fixed-size \c 1x2 or \c 2x1 vectors it is therefore recommended to use the default | 
|---|
| 333 | * constructor Matrix() instead, especially when using one of the non standard | 
|---|
| 334 | * \c EIGEN_INITIALIZE_MATRICES_BY_{ZERO,\c NAN} macros (see \ref TopicPreprocessorDirectives). | 
|---|
| 335 | */ | 
|---|
| 336 | EIGEN_DEVICE_FUNC | 
|---|
| 337 | Matrix(Index rows, Index cols); | 
|---|
| 338 |  | 
|---|
| 339 | /** \brief Constructs an initialized 2D vector with given coefficients */ | 
|---|
| 340 | Matrix(const Scalar& x, const Scalar& y); | 
|---|
| 341 | #endif | 
|---|
| 342 |  | 
|---|
| 343 | /** \brief Constructs an initialized 3D vector with given coefficients */ | 
|---|
| 344 | EIGEN_DEVICE_FUNC | 
|---|
| 345 | EIGEN_STRONG_INLINE Matrix(const Scalar& x, const Scalar& y, const Scalar& z) | 
|---|
| 346 | { | 
|---|
| 347 | Base::_check_template_params(); | 
|---|
| 348 | EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Matrix, 3) | 
|---|
| 349 | m_storage.data()[0] = x; | 
|---|
| 350 | m_storage.data()[1] = y; | 
|---|
| 351 | m_storage.data()[2] = z; | 
|---|
| 352 | } | 
|---|
| 353 | /** \brief Constructs an initialized 4D vector with given coefficients */ | 
|---|
| 354 | EIGEN_DEVICE_FUNC | 
|---|
| 355 | EIGEN_STRONG_INLINE Matrix(const Scalar& x, const Scalar& y, const Scalar& z, const Scalar& w) | 
|---|
| 356 | { | 
|---|
| 357 | Base::_check_template_params(); | 
|---|
| 358 | EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Matrix, 4) | 
|---|
| 359 | m_storage.data()[0] = x; | 
|---|
| 360 | m_storage.data()[1] = y; | 
|---|
| 361 | m_storage.data()[2] = z; | 
|---|
| 362 | m_storage.data()[3] = w; | 
|---|
| 363 | } | 
|---|
| 364 |  | 
|---|
| 365 |  | 
|---|
| 366 | /** \brief Copy constructor */ | 
|---|
| 367 | EIGEN_DEVICE_FUNC | 
|---|
| 368 | EIGEN_STRONG_INLINE Matrix(const Matrix& other) : Base(other) | 
|---|
| 369 | { } | 
|---|
| 370 |  | 
|---|
| 371 | /** \brief Copy constructor for generic expressions. | 
|---|
| 372 | * \sa MatrixBase::operator=(const EigenBase<OtherDerived>&) | 
|---|
| 373 | */ | 
|---|
| 374 | template<typename OtherDerived> | 
|---|
| 375 | EIGEN_DEVICE_FUNC | 
|---|
| 376 | EIGEN_STRONG_INLINE Matrix(const EigenBase<OtherDerived> &other) | 
|---|
| 377 | : Base(other.derived()) | 
|---|
| 378 | { } | 
|---|
| 379 |  | 
|---|
| 380 | EIGEN_DEVICE_FUNC inline Index innerStride() const { return 1; } | 
|---|
| 381 | EIGEN_DEVICE_FUNC inline Index outerStride() const { return this->innerSize(); } | 
|---|
| 382 |  | 
|---|
| 383 | /////////// Geometry module /////////// | 
|---|
| 384 |  | 
|---|
| 385 | template<typename OtherDerived> | 
|---|
| 386 | EIGEN_DEVICE_FUNC | 
|---|
| 387 | explicit Matrix(const RotationBase<OtherDerived,ColsAtCompileTime>& r); | 
|---|
| 388 | template<typename OtherDerived> | 
|---|
| 389 | EIGEN_DEVICE_FUNC | 
|---|
| 390 | Matrix& operator=(const RotationBase<OtherDerived,ColsAtCompileTime>& r); | 
|---|
| 391 |  | 
|---|
| 392 | // allow to extend Matrix outside Eigen | 
|---|
| 393 | #ifdef EIGEN_MATRIX_PLUGIN | 
|---|
| 394 | #include EIGEN_MATRIX_PLUGIN | 
|---|
| 395 | #endif | 
|---|
| 396 |  | 
|---|
| 397 | protected: | 
|---|
| 398 | template <typename Derived, typename OtherDerived, bool IsVector> | 
|---|
| 399 | friend struct internal::conservative_resize_like_impl; | 
|---|
| 400 |  | 
|---|
| 401 | using Base::m_storage; | 
|---|
| 402 | }; | 
|---|
| 403 |  | 
|---|
| 404 | /** \defgroup matrixtypedefs Global matrix typedefs | 
|---|
| 405 | * | 
|---|
| 406 | * \ingroup Core_Module | 
|---|
| 407 | * | 
|---|
| 408 | * Eigen defines several typedef shortcuts for most common matrix and vector types. | 
|---|
| 409 | * | 
|---|
| 410 | * The general patterns are the following: | 
|---|
| 411 | * | 
|---|
| 412 | * \c MatrixSizeType where \c Size can be \c 2,\c 3,\c 4 for fixed size square matrices or \c X for dynamic size, | 
|---|
| 413 | * 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 | 
|---|
| 414 | * for complex double. | 
|---|
| 415 | * | 
|---|
| 416 | * For example, \c Matrix3d is a fixed-size 3x3 matrix type of doubles, and \c MatrixXf is a dynamic-size matrix of floats. | 
|---|
| 417 | * | 
|---|
| 418 | * There are also \c VectorSizeType and \c RowVectorSizeType which are self-explanatory. For example, \c Vector4cf is | 
|---|
| 419 | * a fixed-size vector of 4 complex floats. | 
|---|
| 420 | * | 
|---|
| 421 | * \sa class Matrix | 
|---|
| 422 | */ | 
|---|
| 423 |  | 
|---|
| 424 | #define EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix)   \ | 
|---|
| 425 | /** \ingroup matrixtypedefs */                                    \ | 
|---|
| 426 | typedef Matrix<Type, Size, Size> Matrix##SizeSuffix##TypeSuffix;  \ | 
|---|
| 427 | /** \ingroup matrixtypedefs */                                    \ | 
|---|
| 428 | typedef Matrix<Type, Size, 1>    Vector##SizeSuffix##TypeSuffix;  \ | 
|---|
| 429 | /** \ingroup matrixtypedefs */                                    \ | 
|---|
| 430 | typedef Matrix<Type, 1, Size>    RowVector##SizeSuffix##TypeSuffix; | 
|---|
| 431 |  | 
|---|
| 432 | #define EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, Size)         \ | 
|---|
| 433 | /** \ingroup matrixtypedefs */                                    \ | 
|---|
| 434 | typedef Matrix<Type, Size, Dynamic> Matrix##Size##X##TypeSuffix;  \ | 
|---|
| 435 | /** \ingroup matrixtypedefs */                                    \ | 
|---|
| 436 | typedef Matrix<Type, Dynamic, Size> Matrix##X##Size##TypeSuffix; | 
|---|
| 437 |  | 
|---|
| 438 | #define EIGEN_MAKE_TYPEDEFS_ALL_SIZES(Type, TypeSuffix) \ | 
|---|
| 439 | EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 2, 2) \ | 
|---|
| 440 | EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 3, 3) \ | 
|---|
| 441 | EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 4, 4) \ | 
|---|
| 442 | EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Dynamic, X) \ | 
|---|
| 443 | EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 2) \ | 
|---|
| 444 | EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 3) \ | 
|---|
| 445 | EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 4) | 
|---|
| 446 |  | 
|---|
| 447 | EIGEN_MAKE_TYPEDEFS_ALL_SIZES(int,                  i) | 
|---|
| 448 | EIGEN_MAKE_TYPEDEFS_ALL_SIZES(float,                f) | 
|---|
| 449 | EIGEN_MAKE_TYPEDEFS_ALL_SIZES(double,               d) | 
|---|
| 450 | EIGEN_MAKE_TYPEDEFS_ALL_SIZES(std::complex<float>,  cf) | 
|---|
| 451 | EIGEN_MAKE_TYPEDEFS_ALL_SIZES(std::complex<double>, cd) | 
|---|
| 452 |  | 
|---|
| 453 | #undef EIGEN_MAKE_TYPEDEFS_ALL_SIZES | 
|---|
| 454 | #undef EIGEN_MAKE_TYPEDEFS | 
|---|
| 455 | #undef EIGEN_MAKE_FIXED_TYPEDEFS | 
|---|
| 456 |  | 
|---|
| 457 | } // end namespace Eigen | 
|---|
| 458 |  | 
|---|
| 459 | #endif // EIGEN_MATRIX_H | 
|---|
| 460 |  | 
|---|