22 #ifndef _BLAZE_MATH_EXPRESSIONS_TDVECTSMATMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_TDVECTSMATMULTEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
78 typedef typename VT::ResultType
VRT;
79 typedef typename MT::ResultType
MRT;
80 typedef typename VT::CompositeType
VCT;
81 typedef typename MT::CompositeType
MCT;
98 template<
typename VT2 >
100 enum { value = useAssign };
131 enum { vectorizable = 0 };
158 typedef typename boost::remove_reference<MCT>::type::ConstIterator ConstIterator;
167 const ConstIterator end( A.end(index) );
168 ConstIterator element( A.begin(index) );
171 if( element != end ) {
172 res = x[element->index()] * element->value();
174 for( ; element!=end; ++element )
175 res += x[element->index()] * element->value();
191 return mat_.columns();
221 template<
typename T >
250 template<
typename VT2 >
256 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
258 if( rhs.
mat_.rows() == 0UL ) {
271 for(
size_t j=0UL; j<A.columns(); ++j )
273 const ConstIterator end( A.end(j) );
274 ConstIterator element( A.begin(j) );
276 if( element == end ) {
281 (~lhs)[j] = x[element->index()] * element->value();
283 for( ; element!=end; ++element ) {
284 (~lhs)[j] += x[element->index()] * element->value();
305 template<
typename VT2 >
315 const ResultType tmp( rhs );
335 template<
typename VT2 >
341 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
343 if( rhs.
mat_.rows() == 0UL ) {
355 for(
size_t j=0UL; j<A.columns(); ++j ) {
356 const ConstIterator end( A.end(j) );
357 ConstIterator element( A.begin(j) );
359 for( ; element!=end; ++element ) {
360 (~lhs)[j] += x[element->index()] * element->value();
385 template<
typename VT2 >
391 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
393 if( rhs.
mat_.rows() == 0UL ) {
405 for(
size_t j=0UL; j<A.columns(); ++j ) {
406 const ConstIterator end( A.end(j) );
407 ConstIterator element( A.begin(j) );
409 for( ; element!=end; ++element ) {
410 (~lhs)[j] -= x[element->index()] * element->value();
435 template<
typename VT2 >
445 const ResultType tmp( rhs );
505 template<
typename T1
510 if( (~vec).
size() != (~mat).
rows() )
511 throw std::invalid_argument(
"Vector and matrix sizes do not match" );