25 #ifndef EIGEN_SPARSE_PERMUTATION_H
26 #define EIGEN_SPARSE_PERMUTATION_H
34 template<
typename PermutationType,
typename MatrixType,
int S
ide,
bool Transposed>
35 struct traits<permut_sparsematrix_product_retval<PermutationType, MatrixType, Side, Transposed> >
37 typedef typename remove_all<typename MatrixType::Nested>::type MatrixTypeNestedCleaned;
38 typedef typename MatrixTypeNestedCleaned::Scalar Scalar;
39 typedef typename MatrixTypeNestedCleaned::Index Index;
45 typedef typename internal::conditional<MoveOuter,
46 SparseMatrix<Scalar,SrcStorageOrder,Index>,
47 SparseMatrix<Scalar,int(SrcStorageOrder)==RowMajor?ColMajor:RowMajor,Index> >::type ReturnType;
50 template<
typename PermutationType,
typename MatrixType,
int S
ide,
bool Transposed>
51 struct permut_sparsematrix_product_retval
52 :
public ReturnByValue<permut_sparsematrix_product_retval<PermutationType, MatrixType, Side, Transposed> >
54 typedef typename remove_all<typename MatrixType::Nested>::type MatrixTypeNestedCleaned;
55 typedef typename MatrixTypeNestedCleaned::Scalar Scalar;
56 typedef typename MatrixTypeNestedCleaned::Index Index;
63 permut_sparsematrix_product_retval(
const PermutationType& perm,
const MatrixType& matrix)
64 : m_permutation(perm), m_matrix(matrix)
67 inline int rows()
const {
return m_matrix.rows(); }
68 inline int cols()
const {
return m_matrix.cols(); }
70 template<
typename Dest>
inline void evalTo(Dest& dst)
const
74 SparseMatrix<Scalar,SrcStorageOrder,Index> tmp(m_matrix.rows(), m_matrix.cols());
75 VectorXi sizes(m_matrix.outerSize());
76 for(Index j=0; j<m_matrix.outerSize(); ++j)
78 Index jp = m_permutation.indices().
coeff(j);
79 sizes[((Side==
OnTheLeft) ^ Transposed) ? jp : j] = m_matrix.innerVector(((Side==
OnTheRight) ^ Transposed) ? jp : j).size();
82 for(Index j=0; j<m_matrix.outerSize(); ++j)
84 Index jp = m_permutation.indices().coeff(j);
85 Index jsrc = ((Side==
OnTheRight) ^ Transposed) ? jp : j;
86 Index jdst = ((Side==
OnTheLeft) ^ Transposed) ? jp : j;
87 for(
typename MatrixTypeNestedCleaned::InnerIterator it(m_matrix,jsrc); it; ++it)
88 tmp.insertByOuterInner(jdst,it.index()) = it.value();
94 SparseMatrix<Scalar,int(SrcStorageOrder)==RowMajor?ColMajor:RowMajor,Index> tmp(m_matrix.rows(), m_matrix.cols());
97 PermutationMatrix<Dynamic,Dynamic,Index> perm;
101 perm = m_permutation.transpose();
103 for(Index j=0; j<m_matrix.outerSize(); ++j)
104 for(
typename MatrixTypeNestedCleaned::InnerIterator it(m_matrix,j); it; ++it)
105 sizes[perm.indices().coeff(it.index())]++;
107 for(Index j=0; j<m_matrix.outerSize(); ++j)
108 for(
typename MatrixTypeNestedCleaned::InnerIterator it(m_matrix,j); it; ++it)
109 tmp.insertByOuterInner(perm.indices().coeff(it.index()),j) = it.value();
115 const PermutationType& m_permutation;
116 typename MatrixType::Nested m_matrix;
125 template<
typename SparseDerived,
typename PermDerived>
126 inline const internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived,
OnTheRight,
false>
129 return internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived,
OnTheRight,
false>(perm, matrix.
derived());
134 template<
typename SparseDerived,
typename PermDerived>
135 inline const internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived,
OnTheLeft,
false>
138 return internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived,
OnTheLeft,
false>(perm, matrix.
derived());
145 template<
typename SparseDerived,
typename PermDerived>
146 inline const internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived,
OnTheRight,
true>
149 return internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived,
OnTheRight,
true>(tperm.nestedPermutation(), matrix.
derived());
154 template<
typename SparseDerived,
typename PermDerived>
155 inline const internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived,
OnTheLeft,
true>
158 return internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived,
OnTheLeft,
true>(tperm.nestedPermutation(), matrix.
derived());
163 #endif // EIGEN_SPARSE_SELFADJOINTVIEW_H