| 1 | // This file is part of Eigen, a lightweight C++ template library |
| 2 | // for linear algebra. |
| 3 | // |
| 4 | // Copyright (C) 2006-2009 Benoit Jacob <jacob.benoit.1@gmail.com> |
| 5 | // Copyright (C) 2008 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_MATRIXBASE_H |
| 12 | #define EIGEN_MATRIXBASE_H |
| 13 | |
| 14 | namespace Eigen { |
| 15 | |
| 16 | /** \class MatrixBase |
| 17 | * \ingroup Core_Module |
| 18 | * |
| 19 | * \brief Base class for all dense matrices, vectors, and expressions |
| 20 | * |
| 21 | * This class is the base that is inherited by all matrix, vector, and related expression |
| 22 | * types. Most of the Eigen API is contained in this class, and its base classes. Other important |
| 23 | * classes for the Eigen API are Matrix, and VectorwiseOp. |
| 24 | * |
| 25 | * Note that some methods are defined in other modules such as the \ref LU_Module LU module |
| 26 | * for all functions related to matrix inversions. |
| 27 | * |
| 28 | * \tparam Derived is the derived type, e.g. a matrix type, or an expression, etc. |
| 29 | * |
| 30 | * When writing a function taking Eigen objects as argument, if you want your function |
| 31 | * to take as argument any matrix, vector, or expression, just let it take a |
| 32 | * MatrixBase argument. As an example, here is a function printFirstRow which, given |
| 33 | * a matrix, vector, or expression \a x, prints the first row of \a x. |
| 34 | * |
| 35 | * \code |
| 36 | template<typename Derived> |
| 37 | void printFirstRow(const Eigen::MatrixBase<Derived>& x) |
| 38 | { |
| 39 | cout << x.row(0) << endl; |
| 40 | } |
| 41 | * \endcode |
| 42 | * |
| 43 | * This class can be extended with the help of the plugin mechanism described on the page |
| 44 | * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_MATRIXBASE_PLUGIN. |
| 45 | * |
| 46 | * \sa \blank \ref TopicClassHierarchy |
| 47 | */ |
| 48 | template<typename Derived> class MatrixBase |
| 49 | : public DenseBase<Derived> |
| 50 | { |
| 51 | public: |
| 52 | #ifndef EIGEN_PARSED_BY_DOXYGEN |
| 53 | typedef MatrixBase StorageBaseType; |
| 54 | typedef typename internal::traits<Derived>::StorageKind StorageKind; |
| 55 | typedef typename internal::traits<Derived>::StorageIndex StorageIndex; |
| 56 | typedef typename internal::traits<Derived>::Scalar Scalar; |
| 57 | typedef typename internal::packet_traits<Scalar>::type PacketScalar; |
| 58 | typedef typename NumTraits<Scalar>::Real RealScalar; |
| 59 | |
| 60 | typedef DenseBase<Derived> Base; |
| 61 | using Base::RowsAtCompileTime; |
| 62 | using Base::ColsAtCompileTime; |
| 63 | using Base::SizeAtCompileTime; |
| 64 | using Base::MaxRowsAtCompileTime; |
| 65 | using Base::MaxColsAtCompileTime; |
| 66 | using Base::MaxSizeAtCompileTime; |
| 67 | using Base::IsVectorAtCompileTime; |
| 68 | using Base::Flags; |
| 69 | |
| 70 | using Base::derived; |
| 71 | using Base::const_cast_derived; |
| 72 | using Base::rows; |
| 73 | using Base::cols; |
| 74 | using Base::size; |
| 75 | using Base::coeff; |
| 76 | using Base::coeffRef; |
| 77 | using Base::lazyAssign; |
| 78 | using Base::eval; |
| 79 | using Base::operator+=; |
| 80 | using Base::operator-=; |
| 81 | using Base::operator*=; |
| 82 | using Base::operator/=; |
| 83 | |
| 84 | typedef typename Base::CoeffReturnType CoeffReturnType; |
| 85 | typedef typename Base::ConstTransposeReturnType ConstTransposeReturnType; |
| 86 | typedef typename Base::RowXpr RowXpr; |
| 87 | typedef typename Base::ColXpr ColXpr; |
| 88 | #endif // not EIGEN_PARSED_BY_DOXYGEN |
| 89 | |
| 90 | |
| 91 | |
| 92 | #ifndef EIGEN_PARSED_BY_DOXYGEN |
| 93 | /** type of the equivalent square matrix */ |
| 94 | typedef Matrix<Scalar,EIGEN_SIZE_MAX(RowsAtCompileTime,ColsAtCompileTime), |
| 95 | EIGEN_SIZE_MAX(RowsAtCompileTime,ColsAtCompileTime)> SquareMatrixType; |
| 96 | #endif // not EIGEN_PARSED_BY_DOXYGEN |
| 97 | |
| 98 | /** \returns the size of the main diagonal, which is min(rows(),cols()). |
| 99 | * \sa rows(), cols(), SizeAtCompileTime. */ |
| 100 | EIGEN_DEVICE_FUNC |
| 101 | inline Index diagonalSize() const { return (numext::mini)(rows(),cols()); } |
| 102 | |
| 103 | typedef typename Base::PlainObject PlainObject; |
| 104 | |
| 105 | #ifndef EIGEN_PARSED_BY_DOXYGEN |
| 106 | /** \internal Represents a matrix with all coefficients equal to one another*/ |
| 107 | typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>,PlainObject> ConstantReturnType; |
| 108 | /** \internal the return type of MatrixBase::adjoint() */ |
| 109 | typedef typename internal::conditional<NumTraits<Scalar>::IsComplex, |
| 110 | CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, ConstTransposeReturnType>, |
| 111 | ConstTransposeReturnType |
| 112 | >::type AdjointReturnType; |
| 113 | /** \internal Return type of eigenvalues() */ |
| 114 | typedef Matrix<std::complex<RealScalar>, internal::traits<Derived>::ColsAtCompileTime, 1, ColMajor> EigenvaluesReturnType; |
| 115 | /** \internal the return type of identity */ |
| 116 | typedef CwiseNullaryOp<internal::scalar_identity_op<Scalar>,PlainObject> IdentityReturnType; |
| 117 | /** \internal the return type of unit vectors */ |
| 118 | typedef Block<const CwiseNullaryOp<internal::scalar_identity_op<Scalar>, SquareMatrixType>, |
| 119 | internal::traits<Derived>::RowsAtCompileTime, |
| 120 | internal::traits<Derived>::ColsAtCompileTime> BasisReturnType; |
| 121 | #endif // not EIGEN_PARSED_BY_DOXYGEN |
| 122 | |
| 123 | #define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::MatrixBase |
| 124 | #define EIGEN_DOC_UNARY_ADDONS(X,Y) |
| 125 | # include "../plugins/CommonCwiseUnaryOps.h" |
| 126 | # include "../plugins/CommonCwiseBinaryOps.h" |
| 127 | # include "../plugins/MatrixCwiseUnaryOps.h" |
| 128 | # include "../plugins/MatrixCwiseBinaryOps.h" |
| 129 | # ifdef EIGEN_MATRIXBASE_PLUGIN |
| 130 | # include EIGEN_MATRIXBASE_PLUGIN |
| 131 | # endif |
| 132 | #undef EIGEN_CURRENT_STORAGE_BASE_CLASS |
| 133 | #undef EIGEN_DOC_UNARY_ADDONS |
| 134 | |
| 135 | /** Special case of the template operator=, in order to prevent the compiler |
| 136 | * from generating a default operator= (issue hit with g++ 4.1) |
| 137 | */ |
| 138 | EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE |
| 139 | Derived& operator=(const MatrixBase& other); |
| 140 | |
| 141 | // We cannot inherit here via Base::operator= since it is causing |
| 142 | // trouble with MSVC. |
| 143 | |
| 144 | template <typename OtherDerived> |
| 145 | EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE |
| 146 | Derived& operator=(const DenseBase<OtherDerived>& other); |
| 147 | |
| 148 | template <typename OtherDerived> |
| 149 | EIGEN_DEVICE_FUNC |
| 150 | Derived& operator=(const EigenBase<OtherDerived>& other); |
| 151 | |
| 152 | template<typename OtherDerived> |
| 153 | EIGEN_DEVICE_FUNC |
| 154 | Derived& operator=(const ReturnByValue<OtherDerived>& other); |
| 155 | |
| 156 | template<typename OtherDerived> |
| 157 | EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE |
| 158 | Derived& operator+=(const MatrixBase<OtherDerived>& other); |
| 159 | template<typename OtherDerived> |
| 160 | EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE |
| 161 | Derived& operator-=(const MatrixBase<OtherDerived>& other); |
| 162 | |
| 163 | template<typename OtherDerived> |
| 164 | EIGEN_DEVICE_FUNC |
| 165 | const Product<Derived,OtherDerived> |
| 166 | operator*(const MatrixBase<OtherDerived> &other) const; |
| 167 | |
| 168 | template<typename OtherDerived> |
| 169 | EIGEN_DEVICE_FUNC |
| 170 | const Product<Derived,OtherDerived,LazyProduct> |
| 171 | lazyProduct(const MatrixBase<OtherDerived> &other) const; |
| 172 | |
| 173 | template<typename OtherDerived> |
| 174 | Derived& operator*=(const EigenBase<OtherDerived>& other); |
| 175 | |
| 176 | template<typename OtherDerived> |
| 177 | void applyOnTheLeft(const EigenBase<OtherDerived>& other); |
| 178 | |
| 179 | template<typename OtherDerived> |
| 180 | void applyOnTheRight(const EigenBase<OtherDerived>& other); |
| 181 | |
| 182 | template<typename DiagonalDerived> |
| 183 | EIGEN_DEVICE_FUNC |
| 184 | const Product<Derived, DiagonalDerived, LazyProduct> |
| 185 | operator*(const DiagonalBase<DiagonalDerived> &diagonal) const; |
| 186 | |
| 187 | template<typename OtherDerived> |
| 188 | EIGEN_DEVICE_FUNC |
| 189 | typename ScalarBinaryOpTraits<typename internal::traits<Derived>::Scalar,typename internal::traits<OtherDerived>::Scalar>::ReturnType |
| 190 | dot(const MatrixBase<OtherDerived>& other) const; |
| 191 | |
| 192 | EIGEN_DEVICE_FUNC RealScalar squaredNorm() const; |
| 193 | EIGEN_DEVICE_FUNC RealScalar norm() const; |
| 194 | RealScalar stableNorm() const; |
| 195 | RealScalar blueNorm() const; |
| 196 | RealScalar hypotNorm() const; |
| 197 | EIGEN_DEVICE_FUNC const PlainObject normalized() const; |
| 198 | EIGEN_DEVICE_FUNC const PlainObject stableNormalized() const; |
| 199 | EIGEN_DEVICE_FUNC void normalize(); |
| 200 | EIGEN_DEVICE_FUNC void stableNormalize(); |
| 201 | |
| 202 | EIGEN_DEVICE_FUNC const AdjointReturnType adjoint() const; |
| 203 | EIGEN_DEVICE_FUNC void adjointInPlace(); |
| 204 | |
| 205 | typedef Diagonal<Derived> DiagonalReturnType; |
| 206 | EIGEN_DEVICE_FUNC |
| 207 | DiagonalReturnType diagonal(); |
| 208 | |
| 209 | typedef typename internal::add_const<Diagonal<const Derived> >::type ConstDiagonalReturnType; |
| 210 | EIGEN_DEVICE_FUNC |
| 211 | ConstDiagonalReturnType diagonal() const; |
| 212 | |
| 213 | template<int Index> struct DiagonalIndexReturnType { typedef Diagonal<Derived,Index> Type; }; |
| 214 | template<int Index> struct ConstDiagonalIndexReturnType { typedef const Diagonal<const Derived,Index> Type; }; |
| 215 | |
| 216 | template<int Index> |
| 217 | EIGEN_DEVICE_FUNC |
| 218 | typename DiagonalIndexReturnType<Index>::Type diagonal(); |
| 219 | |
| 220 | template<int Index> |
| 221 | EIGEN_DEVICE_FUNC |
| 222 | typename ConstDiagonalIndexReturnType<Index>::Type diagonal() const; |
| 223 | |
| 224 | typedef Diagonal<Derived,DynamicIndex> DiagonalDynamicIndexReturnType; |
| 225 | typedef typename internal::add_const<Diagonal<const Derived,DynamicIndex> >::type ConstDiagonalDynamicIndexReturnType; |
| 226 | |
| 227 | EIGEN_DEVICE_FUNC |
| 228 | DiagonalDynamicIndexReturnType diagonal(Index index); |
| 229 | EIGEN_DEVICE_FUNC |
| 230 | ConstDiagonalDynamicIndexReturnType diagonal(Index index) const; |
| 231 | |
| 232 | template<unsigned int Mode> struct TriangularViewReturnType { typedef TriangularView<Derived, Mode> Type; }; |
| 233 | template<unsigned int Mode> struct ConstTriangularViewReturnType { typedef const TriangularView<const Derived, Mode> Type; }; |
| 234 | |
| 235 | template<unsigned int Mode> |
| 236 | EIGEN_DEVICE_FUNC |
| 237 | typename TriangularViewReturnType<Mode>::Type triangularView(); |
| 238 | template<unsigned int Mode> |
| 239 | EIGEN_DEVICE_FUNC |
| 240 | typename ConstTriangularViewReturnType<Mode>::Type triangularView() const; |
| 241 | |
| 242 | template<unsigned int UpLo> struct SelfAdjointViewReturnType { typedef SelfAdjointView<Derived, UpLo> Type; }; |
| 243 | template<unsigned int UpLo> struct ConstSelfAdjointViewReturnType { typedef const SelfAdjointView<const Derived, UpLo> Type; }; |
| 244 | |
| 245 | template<unsigned int UpLo> |
| 246 | EIGEN_DEVICE_FUNC |
| 247 | typename SelfAdjointViewReturnType<UpLo>::Type selfadjointView(); |
| 248 | template<unsigned int UpLo> |
| 249 | EIGEN_DEVICE_FUNC |
| 250 | typename ConstSelfAdjointViewReturnType<UpLo>::Type selfadjointView() const; |
| 251 | |
| 252 | const SparseView<Derived> sparseView(const Scalar& m_reference = Scalar(0), |
| 253 | const typename NumTraits<Scalar>::Real& m_epsilon = NumTraits<Scalar>::dummy_precision()) const; |
| 254 | EIGEN_DEVICE_FUNC static const IdentityReturnType Identity(); |
| 255 | EIGEN_DEVICE_FUNC static const IdentityReturnType Identity(Index rows, Index cols); |
| 256 | EIGEN_DEVICE_FUNC static const BasisReturnType Unit(Index size, Index i); |
| 257 | EIGEN_DEVICE_FUNC static const BasisReturnType Unit(Index i); |
| 258 | EIGEN_DEVICE_FUNC static const BasisReturnType UnitX(); |
| 259 | EIGEN_DEVICE_FUNC static const BasisReturnType UnitY(); |
| 260 | EIGEN_DEVICE_FUNC static const BasisReturnType UnitZ(); |
| 261 | EIGEN_DEVICE_FUNC static const BasisReturnType UnitW(); |
| 262 | |
| 263 | EIGEN_DEVICE_FUNC |
| 264 | const DiagonalWrapper<const Derived> asDiagonal() const; |
| 265 | const PermutationWrapper<const Derived> asPermutation() const; |
| 266 | |
| 267 | EIGEN_DEVICE_FUNC |
| 268 | Derived& setIdentity(); |
| 269 | EIGEN_DEVICE_FUNC |
| 270 | Derived& setIdentity(Index rows, Index cols); |
| 271 | |
| 272 | bool isIdentity(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const; |
| 273 | bool isDiagonal(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const; |
| 274 | |
| 275 | bool isUpperTriangular(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const; |
| 276 | bool isLowerTriangular(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const; |
| 277 | |
| 278 | template<typename OtherDerived> |
| 279 | bool isOrthogonal(const MatrixBase<OtherDerived>& other, |
| 280 | const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const; |
| 281 | bool isUnitary(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const; |
| 282 | |
| 283 | /** \returns true if each coefficients of \c *this and \a other are all exactly equal. |
| 284 | * \warning When using floating point scalar values you probably should rather use a |
| 285 | * fuzzy comparison such as isApprox() |
| 286 | * \sa isApprox(), operator!= */ |
| 287 | template<typename OtherDerived> |
| 288 | EIGEN_DEVICE_FUNC inline bool operator==(const MatrixBase<OtherDerived>& other) const |
| 289 | { return cwiseEqual(other).all(); } |
| 290 | |
| 291 | /** \returns true if at least one pair of coefficients of \c *this and \a other are not exactly equal to each other. |
| 292 | * \warning When using floating point scalar values you probably should rather use a |
| 293 | * fuzzy comparison such as isApprox() |
| 294 | * \sa isApprox(), operator== */ |
| 295 | template<typename OtherDerived> |
| 296 | EIGEN_DEVICE_FUNC inline bool operator!=(const MatrixBase<OtherDerived>& other) const |
| 297 | { return cwiseNotEqual(other).any(); } |
| 298 | |
| 299 | NoAlias<Derived,Eigen::MatrixBase > noalias(); |
| 300 | |
| 301 | // TODO forceAlignedAccess is temporarily disabled |
| 302 | // Need to find a nicer workaround. |
| 303 | inline const Derived& forceAlignedAccess() const { return derived(); } |
| 304 | inline Derived& forceAlignedAccess() { return derived(); } |
| 305 | template<bool Enable> inline const Derived& forceAlignedAccessIf() const { return derived(); } |
| 306 | template<bool Enable> inline Derived& forceAlignedAccessIf() { return derived(); } |
| 307 | |
| 308 | EIGEN_DEVICE_FUNC Scalar trace() const; |
| 309 | |
| 310 | template<int p> EIGEN_DEVICE_FUNC RealScalar lpNorm() const; |
| 311 | |
| 312 | EIGEN_DEVICE_FUNC MatrixBase<Derived>& matrix() { return *this; } |
| 313 | EIGEN_DEVICE_FUNC const MatrixBase<Derived>& matrix() const { return *this; } |
| 314 | |
| 315 | /** \returns an \link Eigen::ArrayBase Array \endlink expression of this matrix |
| 316 | * \sa ArrayBase::matrix() */ |
| 317 | EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ArrayWrapper<Derived> array() { return ArrayWrapper<Derived>(derived()); } |
| 318 | /** \returns a const \link Eigen::ArrayBase Array \endlink expression of this matrix |
| 319 | * \sa ArrayBase::matrix() */ |
| 320 | EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const ArrayWrapper<const Derived> array() const { return ArrayWrapper<const Derived>(derived()); } |
| 321 | |
| 322 | /////////// LU module /////////// |
| 323 | |
| 324 | inline const FullPivLU<PlainObject> fullPivLu() const; |
| 325 | inline const PartialPivLU<PlainObject> partialPivLu() const; |
| 326 | |
| 327 | inline const PartialPivLU<PlainObject> lu() const; |
| 328 | |
| 329 | inline const Inverse<Derived> inverse() const; |
| 330 | |
| 331 | template<typename ResultType> |
| 332 | inline void computeInverseAndDetWithCheck( |
| 333 | ResultType& inverse, |
| 334 | typename ResultType::Scalar& determinant, |
| 335 | bool& invertible, |
| 336 | const RealScalar& absDeterminantThreshold = NumTraits<Scalar>::dummy_precision() |
| 337 | ) const; |
| 338 | template<typename ResultType> |
| 339 | inline void computeInverseWithCheck( |
| 340 | ResultType& inverse, |
| 341 | bool& invertible, |
| 342 | const RealScalar& absDeterminantThreshold = NumTraits<Scalar>::dummy_precision() |
| 343 | ) const; |
| 344 | Scalar determinant() const; |
| 345 | |
| 346 | /////////// Cholesky module /////////// |
| 347 | |
| 348 | inline const LLT<PlainObject> llt() const; |
| 349 | inline const LDLT<PlainObject> ldlt() const; |
| 350 | |
| 351 | /////////// QR module /////////// |
| 352 | |
| 353 | inline const HouseholderQR<PlainObject> householderQr() const; |
| 354 | inline const ColPivHouseholderQR<PlainObject> colPivHouseholderQr() const; |
| 355 | inline const FullPivHouseholderQR<PlainObject> fullPivHouseholderQr() const; |
| 356 | inline const CompleteOrthogonalDecomposition<PlainObject> completeOrthogonalDecomposition() const; |
| 357 | |
| 358 | /////////// Eigenvalues module /////////// |
| 359 | |
| 360 | inline EigenvaluesReturnType eigenvalues() const; |
| 361 | inline RealScalar operatorNorm() const; |
| 362 | |
| 363 | /////////// SVD module /////////// |
| 364 | |
| 365 | inline JacobiSVD<PlainObject> jacobiSvd(unsigned int computationOptions = 0) const; |
| 366 | inline BDCSVD<PlainObject> bdcSvd(unsigned int computationOptions = 0) const; |
| 367 | |
| 368 | /////////// Geometry module /////////// |
| 369 | |
| 370 | #ifndef EIGEN_PARSED_BY_DOXYGEN |
| 371 | /// \internal helper struct to form the return type of the cross product |
| 372 | template<typename OtherDerived> struct cross_product_return_type { |
| 373 | typedef typename ScalarBinaryOpTraits<typename internal::traits<Derived>::Scalar,typename internal::traits<OtherDerived>::Scalar>::ReturnType Scalar; |
| 374 | typedef Matrix<Scalar,MatrixBase::RowsAtCompileTime,MatrixBase::ColsAtCompileTime> type; |
| 375 | }; |
| 376 | #endif // EIGEN_PARSED_BY_DOXYGEN |
| 377 | template<typename OtherDerived> |
| 378 | EIGEN_DEVICE_FUNC |
| 379 | #ifndef EIGEN_PARSED_BY_DOXYGEN |
| 380 | inline typename cross_product_return_type<OtherDerived>::type |
| 381 | #else |
| 382 | inline PlainObject |
| 383 | #endif |
| 384 | cross(const MatrixBase<OtherDerived>& other) const; |
| 385 | |
| 386 | template<typename OtherDerived> |
| 387 | EIGEN_DEVICE_FUNC |
| 388 | inline PlainObject cross3(const MatrixBase<OtherDerived>& other) const; |
| 389 | |
| 390 | EIGEN_DEVICE_FUNC |
| 391 | inline PlainObject unitOrthogonal(void) const; |
| 392 | |
| 393 | EIGEN_DEVICE_FUNC |
| 394 | inline Matrix<Scalar,3,1> eulerAngles(Index a0, Index a1, Index a2) const; |
| 395 | |
| 396 | // put this as separate enum value to work around possible GCC 4.3 bug (?) |
| 397 | enum { HomogeneousReturnTypeDirection = ColsAtCompileTime==1&&RowsAtCompileTime==1 ? ((internal::traits<Derived>::Flags&RowMajorBit)==RowMajorBit ? Horizontal : Vertical) |
| 398 | : ColsAtCompileTime==1 ? Vertical : Horizontal }; |
| 399 | typedef Homogeneous<Derived, HomogeneousReturnTypeDirection> HomogeneousReturnType; |
| 400 | EIGEN_DEVICE_FUNC |
| 401 | inline HomogeneousReturnType homogeneous() const; |
| 402 | |
| 403 | enum { |
| 404 | SizeMinusOne = SizeAtCompileTime==Dynamic ? Dynamic : SizeAtCompileTime-1 |
| 405 | }; |
| 406 | typedef Block<const Derived, |
| 407 | internal::traits<Derived>::ColsAtCompileTime==1 ? SizeMinusOne : 1, |
| 408 | internal::traits<Derived>::ColsAtCompileTime==1 ? 1 : SizeMinusOne> ConstStartMinusOne; |
| 409 | typedef EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(ConstStartMinusOne,Scalar,quotient) HNormalizedReturnType; |
| 410 | EIGEN_DEVICE_FUNC |
| 411 | inline const HNormalizedReturnType hnormalized() const; |
| 412 | |
| 413 | ////////// Householder module /////////// |
| 414 | |
| 415 | void makeHouseholderInPlace(Scalar& tau, RealScalar& beta); |
| 416 | template<typename EssentialPart> |
| 417 | void makeHouseholder(EssentialPart& essential, |
| 418 | Scalar& tau, RealScalar& beta) const; |
| 419 | template<typename EssentialPart> |
| 420 | void applyHouseholderOnTheLeft(const EssentialPart& essential, |
| 421 | const Scalar& tau, |
| 422 | Scalar* workspace); |
| 423 | template<typename EssentialPart> |
| 424 | void applyHouseholderOnTheRight(const EssentialPart& essential, |
| 425 | const Scalar& tau, |
| 426 | Scalar* workspace); |
| 427 | |
| 428 | ///////// Jacobi module ///////// |
| 429 | |
| 430 | template<typename OtherScalar> |
| 431 | void applyOnTheLeft(Index p, Index q, const JacobiRotation<OtherScalar>& j); |
| 432 | template<typename OtherScalar> |
| 433 | void applyOnTheRight(Index p, Index q, const JacobiRotation<OtherScalar>& j); |
| 434 | |
| 435 | ///////// SparseCore module ///////// |
| 436 | |
| 437 | template<typename OtherDerived> |
| 438 | EIGEN_STRONG_INLINE const typename SparseMatrixBase<OtherDerived>::template CwiseProductDenseReturnType<Derived>::Type |
| 439 | cwiseProduct(const SparseMatrixBase<OtherDerived> &other) const |
| 440 | { |
| 441 | return other.cwiseProduct(derived()); |
| 442 | } |
| 443 | |
| 444 | ///////// MatrixFunctions module ///////// |
| 445 | |
| 446 | typedef typename internal::stem_function<Scalar>::type StemFunction; |
| 447 | #define EIGEN_MATRIX_FUNCTION(ReturnType, Name, Description) \ |
| 448 | /** \returns an expression of the matrix Description of \c *this. \brief This function requires the <a href="unsupported/group__MatrixFunctions__Module.html"> unsupported MatrixFunctions module</a>. To compute the coefficient-wise Description use ArrayBase::##Name . */ \ |
| 449 | const ReturnType<Derived> Name() const; |
| 450 | #define EIGEN_MATRIX_FUNCTION_1(ReturnType, Name, Description, Argument) \ |
| 451 | /** \returns an expression of the matrix Description of \c *this. \brief This function requires the <a href="unsupported/group__MatrixFunctions__Module.html"> unsupported MatrixFunctions module</a>. To compute the coefficient-wise Description use ArrayBase::##Name . */ \ |
| 452 | const ReturnType<Derived> Name(Argument) const; |
| 453 | |
| 454 | EIGEN_MATRIX_FUNCTION(MatrixExponentialReturnValue, exp, exponential) |
| 455 | /** \brief Helper function for the <a href="unsupported/group__MatrixFunctions__Module.html"> unsupported MatrixFunctions module</a>.*/ |
| 456 | const MatrixFunctionReturnValue<Derived> matrixFunction(StemFunction f) const; |
| 457 | EIGEN_MATRIX_FUNCTION(MatrixFunctionReturnValue, cosh, hyperbolic cosine) |
| 458 | EIGEN_MATRIX_FUNCTION(MatrixFunctionReturnValue, sinh, hyperbolic sine) |
| 459 | EIGEN_MATRIX_FUNCTION(MatrixFunctionReturnValue, cos, cosine) |
| 460 | EIGEN_MATRIX_FUNCTION(MatrixFunctionReturnValue, sin, sine) |
| 461 | EIGEN_MATRIX_FUNCTION(MatrixSquareRootReturnValue, sqrt, square root) |
| 462 | EIGEN_MATRIX_FUNCTION(MatrixLogarithmReturnValue, log, logarithm) |
| 463 | EIGEN_MATRIX_FUNCTION_1(MatrixPowerReturnValue, pow, power to \c p, const RealScalar& p) |
| 464 | EIGEN_MATRIX_FUNCTION_1(MatrixComplexPowerReturnValue, pow, power to \c p, const std::complex<RealScalar>& p) |
| 465 | |
| 466 | protected: |
| 467 | EIGEN_DEVICE_FUNC MatrixBase() : Base() {} |
| 468 | |
| 469 | private: |
| 470 | EIGEN_DEVICE_FUNC explicit MatrixBase(int); |
| 471 | EIGEN_DEVICE_FUNC MatrixBase(int,int); |
| 472 | template<typename OtherDerived> EIGEN_DEVICE_FUNC explicit MatrixBase(const MatrixBase<OtherDerived>&); |
| 473 | protected: |
| 474 | // mixing arrays and matrices is not legal |
| 475 | template<typename OtherDerived> Derived& operator+=(const ArrayBase<OtherDerived>& ) |
| 476 | {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;} |
| 477 | // mixing arrays and matrices is not legal |
| 478 | template<typename OtherDerived> Derived& operator-=(const ArrayBase<OtherDerived>& ) |
| 479 | {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;} |
| 480 | }; |
| 481 | |
| 482 | |
| 483 | /*************************************************************************** |
| 484 | * Implementation of matrix base methods |
| 485 | ***************************************************************************/ |
| 486 | |
| 487 | /** replaces \c *this by \c *this * \a other. |
| 488 | * |
| 489 | * \returns a reference to \c *this |
| 490 | * |
| 491 | * Example: \include MatrixBase_applyOnTheRight.cpp |
| 492 | * Output: \verbinclude MatrixBase_applyOnTheRight.out |
| 493 | */ |
| 494 | template<typename Derived> |
| 495 | template<typename OtherDerived> |
| 496 | inline Derived& |
| 497 | MatrixBase<Derived>::operator*=(const EigenBase<OtherDerived> &other) |
| 498 | { |
| 499 | other.derived().applyThisOnTheRight(derived()); |
| 500 | return derived(); |
| 501 | } |
| 502 | |
| 503 | /** replaces \c *this by \c *this * \a other. It is equivalent to MatrixBase::operator*=(). |
| 504 | * |
| 505 | * Example: \include MatrixBase_applyOnTheRight.cpp |
| 506 | * Output: \verbinclude MatrixBase_applyOnTheRight.out |
| 507 | */ |
| 508 | template<typename Derived> |
| 509 | template<typename OtherDerived> |
| 510 | inline void MatrixBase<Derived>::applyOnTheRight(const EigenBase<OtherDerived> &other) |
| 511 | { |
| 512 | other.derived().applyThisOnTheRight(derived()); |
| 513 | } |
| 514 | |
| 515 | /** replaces \c *this by \a other * \c *this. |
| 516 | * |
| 517 | * Example: \include MatrixBase_applyOnTheLeft.cpp |
| 518 | * Output: \verbinclude MatrixBase_applyOnTheLeft.out |
| 519 | */ |
| 520 | template<typename Derived> |
| 521 | template<typename OtherDerived> |
| 522 | inline void MatrixBase<Derived>::applyOnTheLeft(const EigenBase<OtherDerived> &other) |
| 523 | { |
| 524 | other.derived().applyThisOnTheLeft(derived()); |
| 525 | } |
| 526 | |
| 527 | } // end namespace Eigen |
| 528 | |
| 529 | #endif // EIGEN_MATRIXBASE_H |
| 530 | |