22 #ifndef _BLAZE_MATH_EXPRESSIONS_DMATSVECMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_DMATSVECMULTEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
80 typedef typename MT::ResultType
MRT;
81 typedef typename VT::ResultType
VRT;
82 typedef typename MT::CompositeType
MCT;
83 typedef typename VT::CompositeType
VCT;
100 template<
typename VT2 >
102 enum { value = useAssign };
133 enum { vectorizable = 0 };
159 typedef typename boost::remove_reference<VCT>::type::ConstIterator ConstIterator;
165 ConstIterator element( x.begin() );
168 if( element != x.end() ) {
169 res =
mat_( index, element->index() ) * element->value();
171 for( ; element!=x.end(); ++element )
172 res +=
mat_( index, element->index() ) * element->value();
218 template<
typename T >
220 return mat_.isAliased( alias ) ||
vec_.isAliased( alias );
230 template<
typename T >
232 return mat_.isAliased( alias ) ||
vec_.isAliased( alias );
257 template<
typename VT1 >
265 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
269 if( x.nonZeros() == 0UL ) {
284 const ConstIterator end( x.end() );
286 for(
size_t i=0UL; i<(~lhs).
size(); ++i )
288 ConstIterator element( x.begin() );
290 (~lhs)[i] = A( i, element->index() ) * element->value();
292 for( ; element!=end; ++element )
293 (~lhs)[i] += A( i, element->index() ) * element->value();
314 template<
typename VT1 >
347 template<
typename VT1 >
348 friend inline typename EnableIf< UseAssign<VT1> >::Type
355 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
359 if( x.nonZeros() == 0UL )
return;
371 const ConstIterator end( x.end() );
373 for(
size_t i=0UL; i<(~lhs).
size(); ++i )
375 ConstIterator element( x.begin() );
377 for( ; element!=end; ++element ) {
378 (~lhs)[i] += A( i, element->index() ) * element->value();
404 template<
typename VT1 >
405 friend inline typename EnableIf< UseAssign<VT1> >::Type
412 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
416 if( x.nonZeros() == 0UL )
return;
428 const ConstIterator end( x.end() );
430 for(
size_t i=0UL; i<(~lhs).
size(); ++i )
432 ConstIterator element( x.begin() );
434 for( ; element!=end; ++element ) {
435 (~lhs)[i] -= A( i, element->index() ) * element->value();
461 template<
typename VT1 >
462 friend inline typename EnableIf< UseAssign<VT1> >::Type
535 template<
typename T1
537 inline const typename DisableIf< IsMatMatMultExpr<T1>, DMatSVecMultExpr<T1,T2> >::Type
542 if( (~mat).
columns() != (~vec).size() )
543 throw std::invalid_argument(
"Matrix and vector sizes do not match" );
571 template<
typename T1
574 inline const typename EnableIf< IsMatMatMultExpr<T1>, MultExprTrait<T1,T2> >::Type::Type
579 return (~mat).leftOperand() * ( (~mat).rightOperand() * vec );