11 #ifndef EIGEN_PERMUTATIONMATRIX_H 12 #define EIGEN_PERMUTATIONMATRIX_H 18 enum PermPermProduct_t {PermPermProduct};
45 template<
typename Derived>
48 typedef internal::traits<Derived> Traits;
52 #ifndef EIGEN_PARSED_BY_DOXYGEN 53 typedef typename Traits::IndicesType IndicesType;
55 Flags = Traits::Flags,
56 RowsAtCompileTime = Traits::RowsAtCompileTime,
57 ColsAtCompileTime = Traits::ColsAtCompileTime,
58 MaxRowsAtCompileTime = Traits::MaxRowsAtCompileTime,
59 MaxColsAtCompileTime = Traits::MaxColsAtCompileTime
61 typedef typename Traits::StorageIndex StorageIndex;
66 typedef PlainPermutationType PlainObject;
73 template<
typename OtherDerived>
81 template<
typename OtherDerived>
82 Derived&
operator=(
const TranspositionsBase<OtherDerived>& tr)
84 setIdentity(tr.size());
85 for(
Index k=size()-1; k>=0; --k)
86 applyTranspositionOnTheRight(k,tr.coeff(k));
91 inline EIGEN_DEVICE_FUNC
Index rows()
const {
return Index(indices().size()); }
94 inline EIGEN_DEVICE_FUNC
Index cols()
const {
return Index(indices().size()); }
99 #ifndef EIGEN_PARSED_BY_DOXYGEN 100 template<
typename DenseDerived>
104 for (
Index i=0; i<rows(); ++i)
105 other.
coeffRef(indices().coeff(i),i) =
typename DenseDerived::Scalar(1);
119 const IndicesType&
indices()
const {
return derived().indices(); }
121 IndicesType&
indices() {
return derived().indices(); }
127 indices().resize(newSize);
133 StorageIndex n = StorageIndex(size());
134 for(StorageIndex i = 0; i < n; ++i)
135 indices().coeffRef(i) = i;
157 eigen_assert(i>=0 && j>=0 && i<size() && j<size());
158 for(
Index k = 0; k < size(); ++k)
160 if(indices().coeff(k) == i) indices().coeffRef(k) = StorageIndex(j);
161 else if(indices().coeff(k) == j) indices().coeffRef(k) = StorageIndex(i);
176 eigen_assert(i>=0 && j>=0 && i<size() && j<size());
177 std::swap(indices().coeffRef(i), indices().coeffRef(j));
186 {
return InverseReturnType(derived()); }
192 {
return InverseReturnType(derived()); }
197 #ifndef EIGEN_PARSED_BY_DOXYGEN 199 template<
typename OtherDerived>
202 for (
Index i=0; i<rows();++i) indices().coeffRef(other.
indices().coeff(i)) = i;
204 template<
typename Lhs,
typename Rhs>
205 void assignProduct(
const Lhs& lhs,
const Rhs& rhs)
207 eigen_assert(lhs.cols() == rhs.rows());
208 for (
Index i=0; i<rows();++i) indices().coeffRef(i) = lhs.indices().coeff(rhs.indices().coeff(i));
218 template<
typename Other>
220 {
return PlainPermutationType(internal::PermPermProduct, derived(), other.
derived()); }
226 template<
typename Other>
227 inline PlainPermutationType
operator*(
const InverseImpl<Other,PermutationStorage>& other)
const 228 {
return PlainPermutationType(internal::PermPermProduct, *
this, other.eval()); }
234 template<
typename Other>
friend 236 {
return PlainPermutationType(internal::PermPermProduct, other.eval(), perm); }
252 while(r<n && mask[r]) r++;
258 for(
Index k=indices().coeff(k0); k!=k0; k=indices().coeff(k))
272 template<
int SizeAtCompileTime,
int MaxSizeAtCompileTime,
typename _StorageIndex>
273 struct traits<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, _StorageIndex> >
274 : traits<Matrix<_StorageIndex,SizeAtCompileTime,SizeAtCompileTime,0,MaxSizeAtCompileTime,MaxSizeAtCompileTime> >
278 typedef _StorageIndex StorageIndex;
296 template<
int SizeAtCompileTime,
int MaxSizeAtCompileTime,
typename _StorageIndex>
300 typedef internal::traits<PermutationMatrix> Traits;
305 #ifndef EIGEN_PARSED_BY_DOXYGEN 306 typedef typename Traits::IndicesType IndicesType;
307 typedef typename Traits::StorageIndex StorageIndex;
321 template<
typename OtherDerived>
323 : m_indices(other.indices()) {}
332 template<
typename Other>
337 template<
typename Other>
339 : m_indices(tr.size())
345 template<
typename Other>
353 template<
typename Other>
356 return Base::operator=(tr.derived());
360 const IndicesType&
indices()
const {
return m_indices; }
367 #ifndef EIGEN_PARSED_BY_DOXYGEN 368 template<
typename Other>
370 : m_indices(other.derived().nestedExpression().size())
373 StorageIndex end = StorageIndex(m_indices.size());
374 for (StorageIndex i=0; i<end;++i)
375 m_indices.coeffRef(other.derived().nestedExpression().indices().coeff(i)) = i;
377 template<
typename Lhs,
typename Rhs>
379 : m_indices(lhs.indices().size())
381 Base::assignProduct(lhs,rhs);
387 IndicesType m_indices;
392 template<
int SizeAtCompileTime,
int MaxSizeAtCompileTime,
typename _StorageIndex,
int _PacketAccess>
393 struct traits<Map<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, _StorageIndex>,_PacketAccess> >
394 : traits<Matrix<_StorageIndex,SizeAtCompileTime,SizeAtCompileTime,0,MaxSizeAtCompileTime,MaxSizeAtCompileTime> >
398 typedef _StorageIndex StorageIndex;
403 template<
int SizeAtCompileTime,
int MaxSizeAtCompileTime,
typename _StorageIndex,
int _PacketAccess>
404 class Map<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, _StorageIndex>,_PacketAccess>
405 :
public PermutationBase<Map<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, _StorageIndex>,_PacketAccess> >
408 typedef internal::traits<Map> Traits;
411 #ifndef EIGEN_PARSED_BY_DOXYGEN 413 typedef typename IndicesType::Scalar StorageIndex;
416 inline Map(
const StorageIndex* indicesPtr)
417 : m_indices(indicesPtr)
420 inline Map(
const StorageIndex* indicesPtr,
Index size)
421 : m_indices(indicesPtr,size)
425 template<
typename Other>
427 {
return Base::operator=(other.
derived()); }
430 template<
typename Other>
431 Map& operator=(
const TranspositionsBase<Other>& tr)
432 {
return Base::operator=(tr.derived()); }
434 #ifndef EIGEN_PARSED_BY_DOXYGEN 438 Map& operator=(
const Map& other)
440 m_indices = other.m_indices;
446 const IndicesType& indices()
const {
return m_indices; }
448 IndicesType& indices() {
return m_indices; }
452 IndicesType m_indices;
455 template<
typename _IndicesType>
class TranspositionsWrapper;
457 template<
typename _IndicesType>
458 struct traits<PermutationWrapper<_IndicesType> >
462 typedef typename _IndicesType::Scalar StorageIndex;
463 typedef _IndicesType IndicesType;
465 RowsAtCompileTime = _IndicesType::SizeAtCompileTime,
466 ColsAtCompileTime = _IndicesType::SizeAtCompileTime,
467 MaxRowsAtCompileTime = IndicesType::MaxSizeAtCompileTime,
468 MaxColsAtCompileTime = IndicesType::MaxSizeAtCompileTime,
485 template<
typename _IndicesType>
489 typedef internal::traits<PermutationWrapper> Traits;
492 #ifndef EIGEN_PARSED_BY_DOXYGEN 493 typedef typename Traits::IndicesType IndicesType;
501 const typename internal::remove_all<typename IndicesType::Nested>::type&
506 typename IndicesType::Nested m_indices;
512 template<
typename MatrixDerived,
typename PermutationDerived>
524 template<
typename PermutationDerived,
typename MatrixDerived>
535 template<
typename PermutationType>
536 class InverseImpl<PermutationType, PermutationStorage>
537 :
public EigenBase<Inverse<PermutationType> >
539 typedef typename PermutationType::PlainPermutationType PlainPermutationType;
540 typedef internal::traits<PermutationType> PermTraits;
547 #ifndef EIGEN_PARSED_BY_DOXYGEN 548 typedef typename PermutationType::DenseMatrixType DenseMatrixType;
550 RowsAtCompileTime = PermTraits::RowsAtCompileTime,
551 ColsAtCompileTime = PermTraits::ColsAtCompileTime,
552 MaxRowsAtCompileTime = PermTraits::MaxRowsAtCompileTime,
553 MaxColsAtCompileTime = PermTraits::MaxColsAtCompileTime
557 #ifndef EIGEN_PARSED_BY_DOXYGEN 558 template<
typename DenseDerived>
562 for (
Index i=0; i<derived().rows();++i)
563 other.
coeffRef(i, derived().nestedExpression().indices().coeff(i)) =
typename DenseDerived::Scalar(1);
568 PlainPermutationType eval()
const {
return derived(); }
570 DenseMatrixType toDenseMatrix()
const {
return derived(); }
574 template<
typename OtherDerived>
friend 583 template<
typename OtherDerived>
591 template<
typename Derived>
599 template<>
struct AssignmentKind<DenseShape,PermutationShape> {
typedef EigenBase2EigenBase Kind; };
605 #endif // EIGEN_PERMUTATIONMATRIX_H Expression of the product of two arbitrary matrices or vectors.
Definition: Product.h:71
PlainPermutationType operator*(const PermutationBase< Other > &other) const
Definition: PermutationMatrix.h:219
PermutationMatrix(const MatrixBase< Other > &indices)
Definition: PermutationMatrix.h:333
friend PlainPermutationType operator*(const InverseImpl< Other, PermutationStorage > &other, const PermutationBase &perm)
Definition: PermutationMatrix.h:235
InverseReturnType inverse() const
Definition: PermutationMatrix.h:185
A matrix or vector expression mapping an existing array of data.
Definition: Map.h:94
PlainPermutationType operator*(const InverseImpl< Other, PermutationStorage > &other) const
Definition: PermutationMatrix.h:227
Definition: Constants.h:516
DenseMatrixType toDenseMatrix() const
Definition: PermutationMatrix.h:113
Derived & applyTranspositionOnTheRight(Index i, Index j)
Definition: PermutationMatrix.h:174
Namespace containing all symbols from the Eigen library.
Definition: Core:141
Holds information about the various numeric (i.e. scalar) types allowed by Eigen. ...
Definition: NumTraits.h:232
Derived & derived()
Definition: EigenBase.h:46
Derived & operator=(const PermutationBase< OtherDerived > &other)
Definition: PermutationMatrix.h:74
Eigen::Index Index
The interface type of indices.
Definition: EigenBase.h:39
PermutationMatrix & operator=(const PermutationBase< Other > &other)
Definition: PermutationMatrix.h:346
Base class for permutations.
Definition: PermutationMatrix.h:46
Definition: EigenBase.h:29
Expression of the inverse of another expression.
Definition: Inverse.h:43
Permutation matrix.
Definition: PermutationMatrix.h:297
Index size() const
Definition: PermutationMatrix.h:97
Scalar & coeffRef(Index rowId, Index colId)
Definition: PlainObjectBase.h:175
PermutationMatrix & operator=(const TranspositionsBase< Other > &tr)
Definition: PermutationMatrix.h:354
IndicesType & indices()
Definition: PermutationMatrix.h:121
Index cols() const
Definition: PermutationMatrix.h:94
const IndicesType & indices() const
Definition: PermutationMatrix.h:360
void fill(const Scalar &value)
Definition: CwiseNullaryOp.h:335
Derived & operator=(const TranspositionsBase< OtherDerived > &tr)
Definition: PermutationMatrix.h:82
const Product< MatrixDerived, PermutationDerived, AliasFreeProduct > operator*(const MatrixBase< MatrixDerived > &matrix, const PermutationBase< PermutationDerived > &permutation)
Definition: PermutationMatrix.h:515
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74
Class to view a vector of integers as a permutation matrix.
Definition: PermutationMatrix.h:486
void setIdentity()
Definition: PermutationMatrix.h:131
const IndicesType & indices() const
Definition: PermutationMatrix.h:119
PermutationMatrix(const TranspositionsBase< Other > &tr)
Definition: PermutationMatrix.h:338
Definition: Eigen_Colamd.h:50
Derived & setZero()
Definition: CwiseNullaryOp.h:546
Derived & applyTranspositionOnTheLeft(Index i, Index j)
Definition: PermutationMatrix.h:155
PermutationMatrix(Index size)
Definition: PermutationMatrix.h:315
InverseReturnType transpose() const
Definition: PermutationMatrix.h:191
IndicesType & indices()
Definition: PermutationMatrix.h:362
const internal::remove_all< typename IndicesType::Nested >::type & indices() const
Definition: PermutationMatrix.h:502
void setIdentity(Index newSize)
Definition: PermutationMatrix.h:140
The matrix class, also used for vectors and row-vectors.
Definition: Matrix.h:178
void resize(Index newSize)
Definition: PermutationMatrix.h:125
Scalar & coeffRef(Index row, Index col)
Definition: DenseCoeffsBase.h:342
Index determinant() const
Definition: PermutationMatrix.h:242
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:48
PermutationMatrix(const PermutationBase< OtherDerived > &other)
Definition: PermutationMatrix.h:322
Index rows() const
Definition: PermutationMatrix.h:91