22 #ifndef _BLAZE_MATH_EXPRESSIONS_TSVECDMATMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_TSVECDMATMULTEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
75 class TSVecDMatMultExpr :
public DenseVector< TSVecDMatMultExpr<VT,MT>, true >
81 typedef typename VT::ResultType
VRT;
82 typedef typename MT::ResultType
MRT;
83 typedef typename VT::CompositeType
VCT;
84 typedef typename MT::CompositeType
MCT;
111 enum { vectorizable = 0 };
137 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
143 const ConstIterator end( x.end() );
144 ConstIterator element( x.begin() );
147 if( element != end ) {
148 res = element->value() *
mat_( element->index(), index );
150 for( ; element!=end; ++element )
151 res += element->value() *
mat_( element->index(), index );
167 return mat_.columns();
197 template<
typename T >
199 return vec_.isAliased( alias ) ||
mat_.isAliased( alias );
209 template<
typename T >
211 return vec_.isAliased( alias ) ||
mat_.isAliased( alias );
235 template<
typename VT2 >
243 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
247 if( x.nonZeros() == 0UL ) {
262 const ConstIterator end( x.end() );
264 for(
size_t i=0UL; i<(~lhs).
size(); ++i )
266 ConstIterator element( x.begin() );
268 (~lhs)[i] = element->value() * A(element->index(),i);
270 for( ; element!=end; ++element ) {
271 (~lhs)[i] += element->value() * A(element->index(),i);
292 template<
typename VT2 >
300 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
307 if( x.nonZeros() == 0UL )
return;
319 const ConstIterator end( x.end() );
320 ConstIterator element( x.begin() );
322 for( ; element!=end; ++element ) {
323 for(
size_t i=0UL; i<A.columns(); ++i ) {
324 (~lhs)[i] += element->value() * A(element->index(),i);
343 template<
typename VT2 >
371 template<
typename VT2 >
378 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
382 if( x.nonZeros() == 0UL )
return;
394 const ConstIterator end( x.end() );
395 ConstIterator element( x.begin() );
397 for( ; element!=end; ++element ) {
398 for(
size_t i=0UL; i<A.columns(); ++i ) {
399 (~lhs)[i] += element->value() * A(element->index(),i);
420 template<
typename VT2 >
427 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
431 if( x.nonZeros() == 0UL )
return;
443 const ConstIterator end( x.end() );
444 ConstIterator element( x.begin() );
446 for( ; element!=end; ++element ) {
447 for(
size_t i=0UL; i<A.columns(); ++i ) {
448 (~lhs)[i] -= element->value() * A(element->index(),i);
469 template<
typename VT2 >
540 template<
typename T1,
typename T2 >
541 inline const typename DisableIf< IsMatMatMultExpr<T2>, TSVecDMatMultExpr<T1,T2> >::Type
546 if( (~vec).size() != (~mat).
rows() )
547 throw std::invalid_argument(
"Vector and matrix sizes do not match" );
575 template<
typename T1
578 inline const typename EnableIf< IsMatMatMultExpr<T2>, MultExprTrait<T1,T2> >::Type::Type
583 return ( vec * (~mat).leftOperand() ) * (~mat).rightOperand();