22 #ifndef _BLAZE_MATH_EXPRESSIONS_TSVECDMATMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_TSVECDMATMULTEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
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 };
140 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
146 const ConstIterator end( x.end() );
147 ConstIterator element( x.begin() );
150 if( element != end ) {
151 res = element->value() *
mat_( element->index(), index );
153 for( ; element!=end; ++element )
154 res += element->value() *
mat_( element->index(), index );
170 return mat_.columns();
200 template<
typename T >
227 template<
typename VT2 >
233 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
237 if( x.nonZeros() == 0UL ) {
252 const ConstIterator end( x.end() );
254 for(
size_t i=0UL; i<(~lhs).
size(); ++i )
256 ConstIterator element( x.begin() );
258 (~lhs)[i] = element->value() * A(element->index(),i);
260 for( ; element!=end; ++element ) {
261 (~lhs)[i] += element->value() * A(element->index(),i);
282 template<
typename VT2 >
288 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
295 if( x.nonZeros() == 0UL )
return;
307 const ConstIterator end( x.end() );
308 ConstIterator element( x.begin() );
310 for( ; element!=end; ++element ) {
311 for(
size_t i=0UL; i<A.columns(); ++i ) {
312 (~lhs)[i] += element->value() * A(element->index(),i);
331 template<
typename VT2 >
357 template<
typename VT2 >
362 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
366 if( x.nonZeros() == 0UL )
return;
378 const ConstIterator end( x.end() );
379 ConstIterator element( x.begin() );
381 for( ; element!=end; ++element ) {
382 for(
size_t i=0UL; i<A.columns(); ++i ) {
383 (~lhs)[i] += element->value() * A(element->index(),i);
404 template<
typename VT2 >
409 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
413 if( x.nonZeros() == 0UL )
return;
425 const ConstIterator end( x.end() );
426 ConstIterator element( x.begin() );
428 for( ; element!=end; ++element ) {
429 for(
size_t i=0UL; i<A.columns(); ++i ) {
430 (~lhs)[i] -= element->value() * A(element->index(),i);
451 template<
typename VT2 >
520 template<
typename T1,
typename T2 >
524 if( (~vec).size() != (~mat).
rows() )
525 throw std::invalid_argument(
"Vector and matrix sizes do not match" );
553 template<
typename T1
556 inline const typename EnableIf< IsMatMatMultExpr<T2>, MultExprTrait<T1,T2> >::Type::Type
559 return ( vec * (~mat).leftOperand() ) * (~mat).rightOperand();