22 #ifndef _BLAZE_MATH_EXPRESSIONS_TSVECSMATMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_TSVECSMATMULTEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
80 typedef typename VT::ResultType
VRT;
81 typedef typename MT::ResultType
MRT;
82 typedef typename VT::CompositeType
VCT;
83 typedef typename MT::CompositeType
MCT;
138 typedef typename boost::remove_reference<VCT>::type::ConstIterator VectorIterator;
147 const VectorIterator vend( x.end() );
148 VectorIterator velem( x.begin() );
151 if( velem != vend ) {
152 res = velem->value() * A(velem->index(),index);
154 for( ; velem!=vend; ++velem ) {
155 res += velem->value() * A(velem->index(),index);
172 return mat_.columns();
182 return mat_.columns();
212 template<
typename T >
240 template<
typename VT1 >
246 typedef typename boost::remove_reference<LT>::type::ConstIterator VectorIterator;
247 typedef typename boost::remove_reference<RT>::type::ConstIterator MatrixIterator;
251 if( x.nonZeros() == 0UL ) {
266 const VectorIterator vend( x.end() );
268 for(
size_t i=0UL; i<(~lhs).
size(); ++i )
270 VectorIterator velem( x.begin() );
272 (~lhs)[i] = velem->value() * A(velem->index(),i);
274 for( ; velem!=vend; ++velem ) {
275 (~lhs)[i] += velem->value() * A(velem->index(),i);
296 template<
typename VT1 >
302 typedef typename boost::remove_reference<LT>::type::ConstIterator VectorIterator;
303 typedef typename boost::remove_reference<RT>::type::ConstIterator MatrixIterator;
310 if( x.nonZeros() == 0UL )
return;
322 const VectorIterator vend( x.end() );
323 VectorIterator velem( x.begin() );
325 for( ; velem!=vend; ++velem )
327 const MatrixIterator mend( A.end( velem->index() ) );
328 MatrixIterator melem( A.begin( velem->index() ) );
330 for( ; melem!=mend; ++melem ) {
331 (~lhs)[melem->index()] += velem->value() * melem->value();
350 template<
typename VT1 >
355 typedef typename boost::remove_reference<LT>::type::ConstIterator VectorIterator;
356 typedef typename boost::remove_reference<RT>::type::ConstIterator MatrixIterator;
360 if( x.nonZeros() == 0UL )
return;
372 const VectorIterator vend( x.end() );
373 VectorIterator velem( x.begin() );
375 for( ; velem!=vend; ++velem )
377 const MatrixIterator mend( A.end( velem->index() ) );
378 MatrixIterator melem( A.begin( velem->index() ) );
380 for( ; melem!=mend; ++melem )
382 typename VT1::Iterator pos( (~lhs).find( melem->index() ) );
383 if( pos != (~lhs).end() )
384 pos->value() += velem->value() * melem->value();
386 (~lhs).insert( melem->index(), velem->value() * melem->value() );
406 template<
typename VT1 >
411 typedef typename boost::remove_reference<LT>::type::ConstIterator VectorIterator;
412 typedef typename boost::remove_reference<RT>::type::ConstIterator MatrixIterator;
416 if( x.nonZeros() == 0UL )
return;
428 const VectorIterator vend( x.end() );
429 VectorIterator velem( x.begin() );
431 for( ; velem!=vend; ++velem )
433 const MatrixIterator mend( A.end( velem->index() ) );
434 MatrixIterator melem( A.begin( velem->index() ) );
436 for( ; melem!=mend; ++melem ) {
437 (~lhs)[melem->index()] += velem->value() * melem->value();
461 template<
typename VT1 >
466 typedef typename boost::remove_reference<LT>::type::ConstIterator VectorIterator;
467 typedef typename boost::remove_reference<RT>::type::ConstIterator MatrixIterator;
471 if( x.nonZeros() == 0UL )
return;
483 const VectorIterator vend( x.end() );
484 VectorIterator velem( x.begin() );
486 for( ; velem!=vend; ++velem )
488 const MatrixIterator mend( A.end( velem->index() ) );
489 MatrixIterator melem( A.begin( velem->index() ) );
491 for( ; melem!=mend; ++melem ) {
492 (~lhs)[melem->index()] -= velem->value() * melem->value();
516 template<
typename VT1 >
586 template<
typename T1
591 if( (~vec).size() != (~mat).
rows() )
592 throw std::invalid_argument(
"Vector and matrix sizes do not match" );
620 template<
typename T1
623 inline const typename EnableIf< IsMatMatMultExpr<T2>, MultExprTrait<T1,T2> >::Type::Type
626 return ( vec * (~mat).leftOperand() ) * (~mat).rightOperand();