10#ifndef EIGEN_SPARSE_PERMUTATION_H
11#define EIGEN_SPARSE_PERMUTATION_H
19template<
typename PermutationType,
typename MatrixType,
int S
ide,
bool Transposed>
20struct traits<permut_sparsematrix_product_retval<PermutationType, MatrixType, Side, Transposed> >
22 typedef typename remove_all<typename MatrixType::Nested>::type MatrixTypeNestedCleaned;
23 typedef typename MatrixTypeNestedCleaned::Scalar Scalar;
24 typedef typename MatrixTypeNestedCleaned::Index Index;
30 typedef typename internal::conditional<MoveOuter,
31 SparseMatrix<Scalar,SrcStorageOrder,Index>,
35template<
typename PermutationType,
typename MatrixType,
int S
ide,
bool Transposed>
36struct permut_sparsematrix_product_retval
37 :
public ReturnByValue<permut_sparsematrix_product_retval<PermutationType, MatrixType, Side, Transposed> >
39 typedef typename remove_all<typename MatrixType::Nested>::type MatrixTypeNestedCleaned;
40 typedef typename MatrixTypeNestedCleaned::Scalar Scalar;
41 typedef typename MatrixTypeNestedCleaned::Index Index;
48 permut_sparsematrix_product_retval(
const PermutationType& perm,
const MatrixType& matrix)
49 : m_permutation(perm), m_matrix(matrix)
52 inline int rows()
const {
return m_matrix.rows(); }
53 inline int cols()
const {
return m_matrix.cols(); }
55 template<
typename Dest>
inline void evalTo(Dest& dst)
const
59 SparseMatrix<Scalar,SrcStorageOrder,Index> tmp(m_matrix.rows(), m_matrix.cols());
60 VectorXi sizes(m_matrix.outerSize());
61 for(Index j=0; j<m_matrix.outerSize(); ++j)
63 Index jp = m_permutation.indices().coeff(j);
64 sizes[((Side==
OnTheLeft) ^ Transposed) ? jp : j] = m_matrix.innerVector(((Side==
OnTheRight) ^ Transposed) ? jp : j).size();
67 for(Index j=0; j<m_matrix.outerSize(); ++j)
69 Index jp = m_permutation.indices().coeff(j);
70 Index jsrc = ((Side==
OnTheRight) ^ Transposed) ? jp : j;
71 Index jdst = ((Side==
OnTheLeft) ^ Transposed) ? jp : j;
72 for(
typename MatrixTypeNestedCleaned::InnerIterator it(m_matrix,jsrc); it; ++it)
73 tmp.insertByOuterInner(jdst,it.index()) = it.value();
80 VectorXi sizes(tmp.outerSize());
82 PermutationMatrix<Dynamic,Dynamic,Index> perm;
86 perm = m_permutation.transpose();
88 for(Index j=0; j<m_matrix.outerSize(); ++j)
89 for(
typename MatrixTypeNestedCleaned::InnerIterator it(m_matrix,j); it; ++it)
90 sizes[perm.indices().coeff(it.index())]++;
92 for(Index j=0; j<m_matrix.outerSize(); ++j)
93 for(
typename MatrixTypeNestedCleaned::InnerIterator it(m_matrix,j); it; ++it)
94 tmp.insertByOuterInner(perm.indices().coeff(it.index()),j) = it.value();
100 const PermutationType& m_permutation;
101 typename MatrixType::Nested m_matrix;
110template<
typename SparseDerived,
typename PermDerived>
111inline const internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived,
OnTheRight,
false>
114 return internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived,
OnTheRight,
false>(perm, matrix.derived());
119template<
typename SparseDerived,
typename PermDerived>
120inline const internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived,
OnTheLeft,
false>
123 return internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived,
OnTheLeft,
false>(perm, matrix.derived());
130template<
typename SparseDerived,
typename PermDerived>
131inline const internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived,
OnTheRight,
true>
134 return internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived,
OnTheRight,
true>(tperm.nestedPermutation(), matrix.derived());
139template<
typename SparseDerived,
typename PermDerived>
140inline const internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived,
OnTheLeft,
true>
143 return internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived,
OnTheLeft,
true>(tperm.nestedPermutation(), matrix.derived());
Base class for permutations.
Definition PermutationMatrix.h:54
Base class of any sparse matrices or sparse expressions.
Definition SparseMatrixBase.h:27
Expression of the transpose of a matrix.
Definition Transpose.h:59
@ RowMajor
Definition Constants.h:259
@ ColMajor
Definition Constants.h:257
@ OnTheLeft
Definition Constants.h:270
@ OnTheRight
Definition Constants.h:272
const unsigned int RowMajorBit
Definition Constants.h:48