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 };
162 typedef typename boost::remove_reference<VCT>::type::ConstIterator ConstIterator;
168 ConstIterator element( x.begin() );
171 if( element != x.end() ) {
172 res =
mat_( index, element->index() ) * element->value();
174 for( ; element!=x.end(); ++element )
175 res +=
mat_( index, element->index() ) * element->value();
221 template<
typename T >
249 template<
typename VT1 >
255 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
259 if( x.nonZeros() == 0UL ) {
274 const ConstIterator end( x.end() );
276 for(
size_t i=0UL; i<(~lhs).
size(); ++i )
278 ConstIterator element( x.begin() );
280 (~lhs)[i] = A( i, element->index() ) * element->value();
282 for( ; element!=end; ++element )
283 (~lhs)[i] += A( i, element->index() ) * element->value();
304 template<
typename VT1 >
335 template<
typename VT1 >
336 friend inline typename EnableIf< UseAssign<VT1> >::Type
341 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
345 if( x.nonZeros() == 0UL )
return;
357 const ConstIterator end( x.end() );
359 for(
size_t i=0UL; i<(~lhs).
size(); ++i )
361 ConstIterator element( x.begin() );
363 for( ; element!=end; ++element ) {
364 (~lhs)[i] += A( i, element->index() ) * element->value();
390 template<
typename VT1 >
391 friend inline typename EnableIf< UseAssign<VT1> >::Type
396 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
400 if( x.nonZeros() == 0UL )
return;
412 const ConstIterator end( x.end() );
414 for(
size_t i=0UL; i<(~lhs).
size(); ++i )
416 ConstIterator element( x.begin() );
418 for( ; element!=end; ++element ) {
419 (~lhs)[i] -= A( i, element->index() ) * element->value();
445 template<
typename VT1 >
446 friend inline typename EnableIf< UseAssign<VT1> >::Type
517 template<
typename T1
519 inline const typename DisableIf< IsMatMatMultExpr<T1>, DMatSVecMultExpr<T1,T2> >::Type
522 if( (~mat).
columns() != (~vec).size() )
523 throw std::invalid_argument(
"Matrix and vector sizes do not match" );
551 template<
typename T1
554 inline const typename EnableIf< IsMatMatMultExpr<T1>, MultExprTrait<T1,T2> >::Type::Type
557 return (~mat).leftOperand() * ( (~mat).rightOperand() * vec );