25 #ifndef EIGEN_SPARSE_DIAGONAL_PRODUCT_H
26 #define EIGEN_SPARSE_DIAGONAL_PRODUCT_H
44 template<
typename Lhs,
typename Rhs>
45 struct traits<SparseDiagonalProduct<Lhs, Rhs> >
47 typedef typename remove_all<Lhs>::type _Lhs;
48 typedef typename remove_all<Rhs>::type _Rhs;
49 typedef typename _Lhs::Scalar Scalar;
50 typedef typename promote_index_type<typename traits<Lhs>::Index,
52 typedef Sparse StorageKind;
53 typedef MatrixXpr XprKind;
55 RowsAtCompileTime = _Lhs::RowsAtCompileTime,
56 ColsAtCompileTime = _Rhs::ColsAtCompileTime,
58 MaxRowsAtCompileTime = _Lhs::MaxRowsAtCompileTime,
59 MaxColsAtCompileTime = _Rhs::MaxColsAtCompileTime,
61 SparseFlags = is_diagonal<_Lhs>::ret ?
int(_Rhs::Flags) : int(_Lhs::Flags),
68 template<
typename Lhs,
typename Rhs,
typename SparseDiagonalProductType,
int RhsMode,
int LhsMode>
69 class sparse_diagonal_product_inner_iterator_selector;
73 template<
typename Lhs,
typename Rhs>
76 internal::no_assignment_operator
78 typedef typename Lhs::Nested LhsNested;
79 typedef typename Rhs::Nested RhsNested;
81 typedef typename internal::remove_all<LhsNested>::type _LhsNested;
82 typedef typename internal::remove_all<RhsNested>::type _RhsNested;
95 typedef internal::sparse_diagonal_product_inner_iterator_selector
99 : m_lhs(lhs), m_rhs(rhs)
101 eigen_assert(lhs.cols() == rhs.rows() &&
"invalid sparse matrix * diagonal matrix product");
117 template<
typename Lhs,
typename Rhs,
typename SparseDiagonalProductType>
118 class sparse_diagonal_product_inner_iterator_selector
119 <Lhs,Rhs,SparseDiagonalProductType,SDP_IsDiagonal,SDP_IsSparseRowMajor>
120 :
public CwiseUnaryOp<scalar_multiple_op<typename Lhs::Scalar>,const Rhs>::InnerIterator
123 typedef typename Lhs::Index Index;
125 inline sparse_diagonal_product_inner_iterator_selector(
126 const SparseDiagonalProductType& expr, Index outer)
127 : Base(expr.rhs()*(expr.lhs().diagonal().coeff(outer)), outer)
131 template<
typename Lhs,
typename Rhs,
typename SparseDiagonalProductType>
132 class sparse_diagonal_product_inner_iterator_selector
134 :
public CwiseBinaryOp<
135 scalar_product_op<typename Lhs::Scalar>,
136 SparseInnerVectorSet<Rhs,1>,
137 typename Lhs::DiagonalVectorType>::InnerIterator
139 typedef typename CwiseBinaryOp<
140 scalar_product_op<typename Lhs::Scalar>,
141 SparseInnerVectorSet<Rhs,1>,
142 typename Lhs::DiagonalVectorType>::InnerIterator Base;
143 typedef typename Lhs::Index Index;
145 inline sparse_diagonal_product_inner_iterator_selector(
146 const SparseDiagonalProductType& expr, Index outer)
147 : Base(expr.rhs().innerVector(outer) .cwiseProduct(expr.lhs().diagonal()), 0)
151 template<
typename Lhs,
typename Rhs,
typename SparseDiagonalProductType>
152 class sparse_diagonal_product_inner_iterator_selector
154 :
public CwiseUnaryOp<scalar_multiple_op<typename Rhs::Scalar>,const Lhs>::InnerIterator
156 typedef typename CwiseUnaryOp<scalar_multiple_op<typename Rhs::Scalar>,
const Lhs>::InnerIterator Base;
157 typedef typename Lhs::Index Index;
159 inline sparse_diagonal_product_inner_iterator_selector(
160 const SparseDiagonalProductType& expr, Index outer)
161 : Base(expr.lhs()*expr.rhs().diagonal().coeff(outer), outer)
165 template<
typename Lhs,
typename Rhs,
typename SparseDiagonalProductType>
166 class sparse_diagonal_product_inner_iterator_selector
167 <Lhs,Rhs,SparseDiagonalProductType,SDP_IsSparseRowMajor,SDP_IsDiagonal>
168 :
public CwiseBinaryOp<
169 scalar_product_op<typename Rhs::Scalar>,
170 SparseInnerVectorSet<Lhs,1>,
171 Transpose<const typename Rhs::DiagonalVectorType> >::InnerIterator
173 typedef typename CwiseBinaryOp<
174 scalar_product_op<typename Rhs::Scalar>,
175 SparseInnerVectorSet<Lhs,1>,
176 Transpose<const typename Rhs::DiagonalVectorType> >::InnerIterator Base;
177 typedef typename Lhs::Index Index;
179 inline sparse_diagonal_product_inner_iterator_selector(
180 const SparseDiagonalProductType& expr, Index outer)
181 : Base(expr.lhs().innerVector(outer) .cwiseProduct(expr.rhs().diagonal().transpose()), 0)
189 template<
typename Derived>
190 template<
typename OtherDerived>
191 const SparseDiagonalProduct<Derived,OtherDerived>
199 #endif // EIGEN_SPARSE_DIAGONAL_PRODUCT_H