// This file is part of Eigen, a lightweight C++ template library // for linear algebra. // // Copyright (C) 2009 Benoit Jacob <[email protected]> // Copyright (C) 2009-2015 Gael Guennebaud <[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_PERMUTATIONMATRIX_H #define EIGEN_PERMUTATIONMATRIX_H // IWYU pragma: private #include "./InternalHeaderCheck.h" namespace Eigen { namespace internal { enum PermPermProduct_t { … }; } // end namespace internal /** \class PermutationBase * \ingroup Core_Module * * \brief Base class for permutations * * \tparam Derived the derived class * * This class is the base class for all expressions representing a permutation matrix, * internally stored as a vector of integers. * The convention followed here is that if \f$ \sigma \f$ is a permutation, the corresponding permutation matrix * \f$ P_\sigma \f$ is such that if \f$ (e_1,\ldots,e_p) \f$ is the canonical basis, we have: * \f[ P_\sigma(e_i) = e_{\sigma(i)}. \f] * This convention ensures that for any two permutations \f$ \sigma, \tau \f$, we have: * \f[ P_{\sigma\circ\tau} = P_\sigma P_\tau. \f] * * Permutation matrices are square and invertible. * * Notice that in addition to the member functions and operators listed here, there also are non-member * operator* to multiply any kind of permutation object with any kind of matrix expression (MatrixBase) * on either side. * * \sa class PermutationMatrix, class PermutationWrapper */ template <typename Derived> class PermutationBase : public EigenBase<Derived> { … }; namespace internal { traits<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, StorageIndex_>>; } // namespace internal /** \class PermutationMatrix * \ingroup Core_Module * * \brief Permutation matrix * * \tparam SizeAtCompileTime the number of rows/cols, or Dynamic * \tparam MaxSizeAtCompileTime the maximum number of rows/cols, or Dynamic. This optional parameter defaults to * SizeAtCompileTime. Most of the time, you should not have to specify it. \tparam StorageIndex_ the integer type of the * indices * * This class represents a permutation matrix, internally stored as a vector of integers. * * \sa class PermutationBase, class PermutationWrapper, class DiagonalMatrix */ template <int SizeAtCompileTime, int MaxSizeAtCompileTime, typename StorageIndex_> class PermutationMatrix : public PermutationBase<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, StorageIndex_> > { … }; namespace internal { traits<Map<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, StorageIndex_>, PacketAccess_>>; } // namespace internal Map<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, StorageIndex_>, PacketAccess_>; template <typename IndicesType_> class TranspositionsWrapper; namespace internal { traits<PermutationWrapper<IndicesType_>>; } // namespace internal /** \class PermutationWrapper * \ingroup Core_Module * * \brief Class to view a vector of integers as a permutation matrix * * \tparam IndicesType_ the type of the vector of integer (can be any compatible expression) * * This class allows to view any vector expression of integers as a permutation matrix. * * \sa class PermutationBase, class PermutationMatrix */ template <typename IndicesType_> class PermutationWrapper : public PermutationBase<PermutationWrapper<IndicesType_> > { … }; /** \returns the matrix with the permutation applied to the columns. */ template <typename MatrixDerived, typename PermutationDerived> EIGEN_DEVICE_FUNC const Product<MatrixDerived, PermutationDerived, AliasFreeProduct> operator*( const MatrixBase<MatrixDerived>& matrix, const PermutationBase<PermutationDerived>& permutation) { … } /** \returns the matrix with the permutation applied to the rows. */ template <typename PermutationDerived, typename MatrixDerived> EIGEN_DEVICE_FUNC const Product<PermutationDerived, MatrixDerived, AliasFreeProduct> operator*( const PermutationBase<PermutationDerived>& permutation, const MatrixBase<MatrixDerived>& matrix) { … } InverseImpl<PermutationType, PermutationStorage>; template <typename Derived> const PermutationWrapper<const Derived> MatrixBase<Derived>::asPermutation() const { … } namespace internal { template <> struct AssignmentKind<DenseShape, PermutationShape> { … }; } // end namespace internal } // end namespace Eigen #endif // EIGEN_PERMUTATIONMATRIX_H