// This file is part of Eigen, a lightweight C++ template library // for linear algebra. // // Copyright (C) 2009 Gael Guennebaud <[email protected]> // Copyright (C) 2007-2009 Benoit Jacob <[email protected]> // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. #ifndef EIGEN_DIAGONALMATRIX_H #define EIGEN_DIAGONALMATRIX_H // IWYU pragma: private #include "./InternalHeaderCheck.h" namespace Eigen { /** \class DiagonalBase * \ingroup Core_Module * * \brief Base class for diagonal matrices and expressions * * This is the base class that is inherited by diagonal matrix and related expression * types, which internally use a vector for storing the diagonal entries. Diagonal * types always represent square matrices. * * \tparam Derived is the derived type, a DiagonalMatrix or DiagonalWrapper. * * \sa class DiagonalMatrix, class DiagonalWrapper */ template <typename Derived> class DiagonalBase : public EigenBase<Derived> { … }; /** \class DiagonalMatrix * \ingroup Core_Module * * \brief Represents a diagonal matrix with its storage * * \tparam Scalar_ the type of coefficients * \tparam SizeAtCompileTime the dimension of the matrix, or Dynamic * \tparam MaxSizeAtCompileTime the dimension of the matrix, or Dynamic. This parameter is optional and defaults * to SizeAtCompileTime. Most of the time, you do not need to specify it. * * \sa class DiagonalBase, class DiagonalWrapper */ namespace internal { traits<DiagonalMatrix<Scalar_, SizeAtCompileTime, MaxSizeAtCompileTime>>; } // namespace internal template <typename Scalar_, int SizeAtCompileTime, int MaxSizeAtCompileTime> class DiagonalMatrix : public DiagonalBase<DiagonalMatrix<Scalar_, SizeAtCompileTime, MaxSizeAtCompileTime>> { … }; /** \class DiagonalWrapper * \ingroup Core_Module * * \brief Expression of a diagonal matrix * * \tparam DiagonalVectorType_ the type of the vector of diagonal coefficients * * This class is an expression of a diagonal matrix, but not storing its own vector of diagonal coefficients, * instead wrapping an existing vector expression. It is the return type of MatrixBase::asDiagonal() * and most of the time this is the only way that it is used. * * \sa class DiagonalMatrix, class DiagonalBase, MatrixBase::asDiagonal() */ namespace internal { traits<DiagonalWrapper<DiagonalVectorType_>>; } // namespace internal template <typename DiagonalVectorType_> class DiagonalWrapper : public DiagonalBase<DiagonalWrapper<DiagonalVectorType_>>, internal::no_assignment_operator { … }; /** \returns a pseudo-expression of a diagonal matrix with *this as vector of diagonal coefficients * * \only_for_vectors * * Example: \include MatrixBase_asDiagonal.cpp * Output: \verbinclude MatrixBase_asDiagonal.out * * \sa class DiagonalWrapper, class DiagonalMatrix, diagonal(), isDiagonal() **/ template <typename Derived> EIGEN_DEVICE_FUNC inline const DiagonalWrapper<const Derived> MatrixBase<Derived>::asDiagonal() const { … } /** \returns true if *this is approximately equal to a diagonal matrix, * within the precision given by \a prec. * * Example: \include MatrixBase_isDiagonal.cpp * Output: \verbinclude MatrixBase_isDiagonal.out * * \sa asDiagonal() */ template <typename Derived> bool MatrixBase<Derived>::isDiagonal(const RealScalar& prec) const { … } namespace internal { template <> struct storage_kind_to_shape<DiagonalShape> { … }; struct Diagonal2Dense { … }; template <> struct AssignmentKind<DenseShape, DiagonalShape> { … }; // Diagonal matrix to Dense assignment Assignment<DstXprType, SrcXprType, Functor, Diagonal2Dense>; } // namespace internal } // end namespace Eigen #endif // EIGEN_DIAGONALMATRIX_H