22 #ifndef _BLAZE_MATH_EXPRESSIONS_TSMATDVECMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_TSMATDVECMULTEXPR_H_
74 class TSMatDVecMultExpr :
public DenseVector< TSMatDVecMultExpr<MT,VT>, false >
75 ,
private MatVecMultExpr
80 typedef typename MT::ResultType
MRT;
81 typedef typename VT::ResultType
VRT;
82 typedef typename MT::CompositeType
MCT;
83 typedef typename VT::CompositeType
VCT;
110 enum { vectorizable = 0 };
138 if(
vec_.size() > 0UL ) {
140 for(
size_t j=1UL; j<
vec_.size(); ++j )
187 template<
typename T >
189 return (
mat_.isAliased( alias ) ||
vec_.isAliased( alias ) );
199 template<
typename T >
201 return (
mat_.isAliased( alias ) ||
vec_.isAliased( alias ) );
225 template<
typename VT1 >
237 if( rhs.mat_.columns() == 0UL )
return;
247 for(
size_t j=0UL; j<A.columns(); ++j )
249 ConstIterator element( A.begin(j) );
250 const ConstIterator end( A.end(j) );
252 for( ; element!=end; ++element ) {
253 if(
isDefault( (~lhs)[element->index()] ) )
254 (~lhs)[element->index()] = element->value() * x[j];
256 (~lhs)[element->index()] += element->value() * x[j];
277 template<
typename VT1 >
289 if( rhs.mat_.columns() == 0UL )
return;
299 for(
size_t j=0UL; j<A.columns(); ++j )
301 ConstIterator element( A.begin(j) );
302 const ConstIterator end( A.end(j) );
304 for( ; element!=end; ++element ) {
305 (~lhs)[element->index()] += element->value() * x[j];
324 template<
typename VT1 >
356 template<
typename VT1 >
363 typedef typename RemoveReference<LT>::Type::ConstIterator ConstIterator;
365 if( rhs.mat_.columns() == 0UL )
return;
375 for(
size_t j=0UL; j<A.columns(); ++j )
377 ConstIterator element( A.begin(j) );
378 const ConstIterator end( A.end(j) );
380 for( ; element!=end; ++element ) {
381 (~lhs)[element->index()] += element->value() * x[j];
407 template<
typename VT1 >
414 typedef typename RemoveReference<LT>::Type::ConstIterator ConstIterator;
416 if( rhs.mat_.columns() == 0UL )
return;
426 for(
size_t j=0UL; j<A.columns(); ++j )
428 ConstIterator element( A.begin(j) );
429 const ConstIterator end( A.end(j) );
431 for( ; element!=end; ++element ) {
432 (~lhs)[element->index()] -= element->value() * x[j];
458 template<
typename VT1 >
530 template<
typename T1
532 inline const typename DisableIf< IsMatMatMultExpr<T1>, TSMatDVecMultExpr<T1,T2> >::Type
537 if( (~mat).
columns() != (~vec).size() )
538 throw std::invalid_argument(
"Matrix and vector sizes do not match" );