22 #ifndef _BLAZE_MATH_EXPRESSIONS_TSVECTDMATMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_TSVECTDMATMULTEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
79 typedef typename VT::ResultType
VRT;
80 typedef typename MT::ResultType
MRT;
81 typedef typename VT::CompositeType
VCT;
82 typedef typename MT::CompositeType
MCT;
99 template<
typename VT2 >
101 enum { value = useAssign };
132 enum { vectorizable = 0 };
161 typedef typename boost::remove_reference<VCT>::type::ConstIterator ConstIterator;
167 const ConstIterator end( x.end() );
168 ConstIterator element( x.begin() );
171 if( element != end ) {
172 res = element->value() *
mat_( element->index(), index );
174 for( ; element!=end; ++element )
175 res += element->value() *
mat_( element->index(), index );
191 return mat_.columns();
221 template<
typename T >
250 template<
typename VT2 >
256 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
260 if( x.nonZeros() == 0UL ) {
275 const ConstIterator end( x.end() );
277 for(
size_t i=0UL; i<(~lhs).
size(); ++i )
279 ConstIterator element( x.begin() );
281 (~lhs)[i] = element->value() * A(element->index(),i);
283 for( ; element!=end; ++element ) {
284 (~lhs)[i] += element->value() * A(element->index(),i);
304 template<
typename VT2 >
313 const ResultType tmp( rhs );
330 template<
typename VT2 >
335 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
339 if( x.nonZeros() == 0UL )
return;
351 const ConstIterator end( x.end() );
352 ConstIterator element( x.begin() );
354 for( ; element!=end; ++element ) {
355 for(
size_t i=0UL; i<A.columns(); ++i ) {
356 (~lhs)[i] += element->value() * A(element->index(),i);
377 template<
typename VT2 >
382 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
386 if( x.nonZeros() == 0UL )
return;
398 const ConstIterator end( x.end() );
399 ConstIterator element( x.begin() );
401 for( ; element!=end; ++element ) {
402 for(
size_t i=0UL; i<A.columns(); ++i ) {
403 (~lhs)[i] -= element->value() * A(element->index(),i);
424 template<
typename VT2 >
433 const ResultType tmp( rhs );
493 template<
typename T1,
typename T2 >
497 if( (~vec).
size() != (~mat).
rows() )
498 throw std::invalid_argument(
"Vector and matrix sizes do not match" );