| 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 | |