MOAB  4.9.3pre
Eigen::PermutationBase< Derived > Class Template Reference

Base class for permutations. More...

#include <PermutationMatrix.h>

Inheritance diagram for Eigen::PermutationBase< Derived >:
Collaboration diagram for Eigen::PermutationBase< Derived >:

List of all members.

Public Types

enum  {
  Flags = Traits::Flags, RowsAtCompileTime = Traits::RowsAtCompileTime, ColsAtCompileTime = Traits::ColsAtCompileTime, MaxRowsAtCompileTime = Traits::MaxRowsAtCompileTime,
  MaxColsAtCompileTime = Traits::MaxColsAtCompileTime
}
typedef Traits::IndicesType IndicesType
typedef Traits::StorageIndex StorageIndex
typedef Matrix< StorageIndex,
RowsAtCompileTime,
ColsAtCompileTime,
0, MaxRowsAtCompileTime,
MaxColsAtCompileTime
DenseMatrixType
typedef PermutationMatrix
< IndicesType::SizeAtCompileTime,
IndicesType::MaxSizeAtCompileTime,
StorageIndex
PlainPermutationType
typedef PlainPermutationType PlainObject
typedef Inverse< Derived > InverseReturnType
typedef void Scalar

Public Member Functions

template<typename OtherDerived >
Derived & operator= (const PermutationBase< OtherDerived > &other)
template<typename OtherDerived >
Derived & operator= (const TranspositionsBase< OtherDerived > &tr)
Derived & operator= (const PermutationBase &other)
Index rows () const
Index cols () const
Index size () const
template<typename DenseDerived >
void evalTo (MatrixBase< DenseDerived > &other) const
DenseMatrixType toDenseMatrix () const
const IndicesTypeindices () const
IndicesTypeindices ()
void resize (Index newSize)
void setIdentity ()
void setIdentity (Index newSize)
Derived & applyTranspositionOnTheLeft (Index i, Index j)
Derived & applyTranspositionOnTheRight (Index i, Index j)
InverseReturnType inverse () const
InverseReturnType transpose () const
template<typename Other >
PlainPermutationType operator* (const PermutationBase< Other > &other) const
template<typename Other >
PlainPermutationType operator* (const InverseImpl< Other, PermutationStorage > &other) const
Index determinant () const

Protected Member Functions

template<typename OtherDerived >
void assignTranspose (const PermutationBase< OtherDerived > &other)
template<typename Lhs , typename Rhs >
void assignProduct (const Lhs &lhs, const Rhs &rhs)

Private Types

typedef internal::traits< Derived > Traits
typedef EigenBase< Derived > Base

Friends

template<typename Other >
PlainPermutationType operator* (const InverseImpl< Other, PermutationStorage > &other, const PermutationBase &perm)

Detailed Description

template<typename Derived>
class Eigen::PermutationBase< Derived >

Base class for permutations.

Template Parameters:
Derivedthe 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 $ \sigma $ is a permutation, the corresponding permutation matrix $ P_\sigma $ is such that if $ (e_1,\ldots,e_p) $ is the canonical basis, we have:

\[ P_\sigma(e_i) = e_{\sigma(i)}. \]

This convention ensures that for any two permutations $ \sigma, \tau $, we have:

\[ P_{\sigma\circ\tau} = P_\sigma P_\tau. \]

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.

See also:
class PermutationMatrix, class PermutationWrapper

Definition at line 46 of file PermutationMatrix.h.


Member Typedef Documentation

template<typename Derived>
typedef Inverse<Derived> Eigen::PermutationBase< Derived >::InverseReturnType

Definition at line 68 of file PermutationMatrix.h.

template<typename Derived>
typedef PlainPermutationType Eigen::PermutationBase< Derived >::PlainObject

Definition at line 66 of file PermutationMatrix.h.

template<typename Derived>
typedef PermutationMatrix<IndicesType::SizeAtCompileTime,IndicesType::MaxSizeAtCompileTime,StorageIndex> Eigen::PermutationBase< Derived >::PlainPermutationType

Definition at line 65 of file PermutationMatrix.h.

template<typename Derived>
typedef void Eigen::PermutationBase< Derived >::Scalar

Definition at line 69 of file PermutationMatrix.h.


Member Enumeration Documentation

template<typename Derived>
anonymous enum
Enumerator:
Flags 
RowsAtCompileTime 
ColsAtCompileTime 
MaxRowsAtCompileTime 
MaxColsAtCompileTime 

Definition at line 54 of file PermutationMatrix.h.


Member Function Documentation

template<typename Derived>
Derived& Eigen::PermutationBase< Derived >::applyTranspositionOnTheLeft ( Index  i,
Index  j 
) [inline]

Multiplies *this by the transposition $(ij)$ on the left.

Returns:
a reference to *this.
Warning:
This is much slower than applyTranspositionOnTheRight(Index,Index): this has linear complexity and requires a lot of branching.
See also:
applyTranspositionOnTheRight(Index,Index)

Definition at line 166 of file PermutationMatrix.h.

    {
      eigen_assert(i>=0 && j>=0 && i<size() && j<size());
      for(Index k = 0; k < size(); ++k)
      {
        if(indices().coeff(k) == i) indices().coeffRef(k) = StorageIndex(j);
        else if(indices().coeff(k) == j) indices().coeffRef(k) = StorageIndex(i);
      }
      return derived();
    }
template<typename Derived>
Derived& Eigen::PermutationBase< Derived >::applyTranspositionOnTheRight ( Index  i,
Index  j 
) [inline]

Multiplies *this by the transposition $(ij)$ on the right.

Returns:
a reference to *this.

This is a fast operation, it only consists in swapping two indices.

See also:
applyTranspositionOnTheLeft(Index,Index)

Definition at line 185 of file PermutationMatrix.h.

    {
      eigen_assert(i>=0 && j>=0 && i<size() && j<size());
      std::swap(indices().coeffRef(i), indices().coeffRef(j));
      return derived();
    }
template<typename Derived>
template<typename Lhs , typename Rhs >
void Eigen::PermutationBase< Derived >::assignProduct ( const Lhs &  lhs,
const Rhs &  rhs 
) [inline, protected]

Definition at line 216 of file PermutationMatrix.h.

    {
      eigen_assert(lhs.cols() == rhs.rows());
      for (Index i=0; i<rows();++i) indices().coeffRef(i) = lhs.indices().coeff(rhs.indices().coeff(i));
    }
template<typename Derived>
template<typename OtherDerived >
void Eigen::PermutationBase< Derived >::assignTranspose ( const PermutationBase< OtherDerived > &  other) [inline, protected]

Definition at line 211 of file PermutationMatrix.h.

    {
      for (Index i=0; i<rows();++i) indices().coeffRef(other.indices().coeff(i)) = i;
    }
template<typename Derived>
Index Eigen::PermutationBase< Derived >::cols ( void  ) const [inline]
Returns:
the number of columns

Reimplemented from Eigen::EigenBase< Derived >.

Definition at line 105 of file PermutationMatrix.h.

{ return Index(indices().size()); }
template<typename Derived>
Index Eigen::PermutationBase< Derived >::determinant ( ) const [inline]
Returns:
the determinant of the permutation matrix, which is either 1 or -1 depending on the parity of the permutation.

This function is O(n) procedure allocating a buffer of n booleans.

Definition at line 253 of file PermutationMatrix.h.

    {
      Index res = 1;
      Index n = size();
      Matrix<bool,RowsAtCompileTime,1,0,MaxRowsAtCompileTime> mask(n);
      mask.fill(false);
      Index r = 0;
      while(r < n)
      {
        // search for the next seed
        while(r<n && mask[r]) r++;
        if(r>=n)
          break;
        // we got one, let's follow it until we are back to the seed
        Index k0 = r++;
        mask.coeffRef(k0) = true;
        for(Index k=indices().coeff(k0); k!=k0; k=indices().coeff(k))
        {
          mask.coeffRef(k) = true;
          res = -res;
        }
      }
      return res;
    }
template<typename Derived>
template<typename DenseDerived >
void Eigen::PermutationBase< Derived >::evalTo ( MatrixBase< DenseDerived > &  other) const [inline]

Definition at line 112 of file PermutationMatrix.h.

    {
      other.setZero();
      for (Index i=0; i<rows(); ++i)
        other.coeffRef(indices().coeff(i),i) = typename DenseDerived::Scalar(1);
    }
template<typename Derived>
InverseReturnType Eigen::PermutationBase< Derived >::inverse ( ) const [inline]
Returns:
the inverse permutation matrix.
Note:

Definition at line 196 of file PermutationMatrix.h.

    { return InverseReturnType(derived()); }
template<typename Derived>
template<typename Other >
PlainPermutationType Eigen::PermutationBase< Derived >::operator* ( const PermutationBase< Other > &  other) const [inline]
Returns:
the product permutation matrix.
Note:

Definition at line 230 of file PermutationMatrix.h.

    { return PlainPermutationType(internal::PermPermProduct, derived(), other.derived()); }
template<typename Derived>
template<typename Other >
PlainPermutationType Eigen::PermutationBase< Derived >::operator* ( const InverseImpl< Other, PermutationStorage > &  other) const [inline]
Returns:
the product of a permutation with another inverse permutation.
Note:

Definition at line 238 of file PermutationMatrix.h.

    { return PlainPermutationType(internal::PermPermProduct, *this, other.eval()); }
template<typename Derived>
template<typename OtherDerived >
Derived& Eigen::PermutationBase< Derived >::operator= ( const PermutationBase< OtherDerived > &  other) [inline]

Copies the other permutation into *this

Definition at line 74 of file PermutationMatrix.h.

    {
      indices() = other.indices();
      return derived();
    }
template<typename Derived>
template<typename OtherDerived >
Derived& Eigen::PermutationBase< Derived >::operator= ( const TranspositionsBase< OtherDerived > &  tr) [inline]

Assignment from the Transpositions tr

Definition at line 82 of file PermutationMatrix.h.

    {
      setIdentity(tr.size());
      for(Index k=size()-1; k>=0; --k)
        applyTranspositionOnTheRight(k,tr.coeff(k));
      return derived();
    }
template<typename Derived>
Derived& Eigen::PermutationBase< Derived >::operator= ( const PermutationBase< Derived > &  other) [inline]

This is a special case of the templated operator=. Its purpose is to prevent a default operator= from hiding the templated operator=.

Definition at line 94 of file PermutationMatrix.h.

    {
      indices() = other.indices();
      return derived();
    }
template<typename Derived>
void Eigen::PermutationBase< Derived >::resize ( Index  newSize) [inline]

Resizes to given size.

Definition at line 136 of file PermutationMatrix.h.

    {
      indices().resize(newSize);
    }
template<typename Derived>
Index Eigen::PermutationBase< Derived >::rows ( void  ) const [inline]
Returns:
the number of rows

Reimplemented from Eigen::EigenBase< Derived >.

Definition at line 102 of file PermutationMatrix.h.

{ return Index(indices().size()); }
template<typename Derived>
void Eigen::PermutationBase< Derived >::setIdentity ( ) [inline]

Sets *this to be the identity permutation matrix

Definition at line 142 of file PermutationMatrix.h.

    {
      StorageIndex n = StorageIndex(size());
      for(StorageIndex i = 0; i < n; ++i)
        indices().coeffRef(i) = i;
    }
template<typename Derived>
void Eigen::PermutationBase< Derived >::setIdentity ( Index  newSize) [inline]

Sets *this to be the identity permutation matrix of given size.

Definition at line 151 of file PermutationMatrix.h.

    {
      resize(newSize);
      setIdentity();
    }
template<typename Derived>
Index Eigen::PermutationBase< Derived >::size ( ) const [inline]
Returns:
the size of a side of the respective square matrix, i.e., the number of indices

Reimplemented from Eigen::EigenBase< Derived >.

Definition at line 108 of file PermutationMatrix.h.

{ return Index(indices().size()); }
template<typename Derived>
DenseMatrixType Eigen::PermutationBase< Derived >::toDenseMatrix ( ) const [inline]
Returns:
a Matrix object initialized from this permutation matrix. Notice that it is inefficient to return this Matrix object by value. For efficiency, favor using the Matrix constructor taking EigenBase objects.

Definition at line 124 of file PermutationMatrix.h.

    {
      return derived();
    }
template<typename Derived>
InverseReturnType Eigen::PermutationBase< Derived >::transpose ( ) const [inline]
Returns:
the tranpose permutation matrix.
Note:

Definition at line 202 of file PermutationMatrix.h.

    { return InverseReturnType(derived()); }

Friends And Related Function Documentation

template<typename Derived>
template<typename Other >
PlainPermutationType operator* ( const InverseImpl< Other, PermutationStorage > &  other,
const PermutationBase< Derived > &  perm 
) [friend]
Returns:
the product of an inverse permutation with another permutation.
Note:

Definition at line 246 of file PermutationMatrix.h.

    { return PlainPermutationType(internal::PermPermProduct, other.eval(), perm); }

The documentation for this class was generated from the following file:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines