22 #ifndef _BLAZE_MATH_EXPRESSIONS_TDMATSVECMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_TDMATSVECMULTEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
72 class TDMatSVecMultExpr :
public DenseVector< TDMatSVecMultExpr<MT,VT>, false >
78 typedef typename MT::ResultType
MRT;
79 typedef typename VT::ResultType
VRT;
80 typedef typename MT::CompositeType
MCT;
81 typedef typename VT::CompositeType
VCT;
100 typedef typename MT::CompositeType
LT;
108 enum { vectorizable = 0 };
134 typedef typename boost::remove_reference<VCT>::type::ConstIterator ConstIterator;
140 ConstIterator element( x.begin() );
143 if( element != x.end() ) {
144 res =
mat_( index, element->index() ) * element->value();
146 for( ; element!=x.end(); ++element )
147 res +=
mat_( index, element->index() ) * element->value();
193 template<
typename T >
195 return mat_.isAliased( alias ) ||
vec_.isAliased( alias );
205 template<
typename T >
207 return mat_.isAliased( alias ) ||
vec_.isAliased( alias );
229 template<
typename VT1 >
236 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
240 if( x.nonZeros() == 0UL ) {
255 ConstIterator element( x.begin() );
256 const ConstIterator end( x.end() );
258 for(
size_t i=0UL; i<A.rows(); ++i )
259 (~lhs)[i] = A(i,element->index()) * element->value();
262 while( element != end ) {
263 for(
size_t i=0UL; i<A.rows(); ++i )
264 (~lhs)[i] += A(i,element->index()) * element->value();
286 template<
typename VT1 >
318 template<
typename VT1 >
325 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
329 if( x.nonZeros() == 0UL )
return;
341 ConstIterator element( x.begin() );
342 const ConstIterator end( x.end() );
344 while( element != end ) {
345 for(
size_t i=0UL; i<A.rows(); ++i )
346 (~lhs)[i] += A(i,element->index()) * element->value();
372 template<
typename VT1 >
379 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
383 if( x.nonZeros() == 0UL )
return;
395 ConstIterator element( x.begin() );
396 const ConstIterator end( x.end() );
398 while( element != end ) {
399 for(
size_t i=0UL; i<A.rows(); ++i )
400 (~lhs)[i] -= A(i,element->index()) * element->value();
426 template<
typename VT1 >
499 template<
typename T1
501 inline const typename DisableIf< IsMatMatMultExpr<T1>, TDMatSVecMultExpr<T1,T2> >::Type
506 if( (~mat).
columns() != (~vec).size() )
507 throw std::invalid_argument(
"Matrix and vector sizes do not match" );