22 #ifndef _BLAZE_MATH_EXPRESSIONS_TSMATSVECMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_TSMATSVECMULTEXPR_H_
32 #include <boost/type_traits/remove_reference.hpp>
81 typedef typename MT::ResultType
MRT;
82 typedef typename VT::ResultType
VRT;
83 typedef typename MT::CompositeType
MCT;
84 typedef typename VT::CompositeType
VCT;
140 typedef typename boost::remove_reference<MCT>::type::ConstIterator MatrixIterator;
141 typedef typename boost::remove_reference<VCT>::type::ConstIterator VectorIterator;
152 const VectorIterator vend( x.end() );
153 VectorIterator velem( x.begin() );
155 if(
vec_.size() > 0UL && velem != vend ) {
156 res = A( index, velem->index() ) * velem->value();
158 for( ; velem!=vend; ++velem )
159 res += A( index, velem->index() ) * velem->value();
215 template<
typename T >
243 template<
typename VT1 >
249 typedef typename boost::remove_reference<LT>::type::ConstIterator MatrixIterator;
250 typedef typename boost::remove_reference<RT>::type::ConstIterator VectorIterator;
257 if( x.nonZeros() == 0UL )
return;
269 const VectorIterator vend ( x.end() );
270 VectorIterator velem( x.begin() );
272 for( ; velem!=vend; ++velem )
274 const MatrixIterator mend ( A.end( velem->index() ) );
275 MatrixIterator melem( A.begin( velem->index() ) );
277 for( ; melem!=mend; ++melem ) {
278 if(
isDefault( (~lhs)[melem->index()] ) )
279 (~lhs)[melem->index()] = melem->value() * velem->value();
281 (~lhs)[melem->index()] += melem->value() * velem->value();
302 template<
typename VT1 >
308 typedef typename boost::remove_reference<LT>::type::ConstIterator MatrixIterator;
309 typedef typename boost::remove_reference<RT>::type::ConstIterator VectorIterator;
316 if( x.nonZeros() == 0UL )
return;
328 const VectorIterator vend ( x.end() );
329 VectorIterator velem( x.begin() );
331 for( ; velem!=vend; ++velem )
333 const MatrixIterator mend ( A.end( velem->index() ) );
334 MatrixIterator melem( A.begin( velem->index() ) );
336 for( ; melem!=mend; ++melem ) {
337 (~lhs)[melem->index()] += melem->value() * velem->value();
356 template<
typename VT1 >
361 typedef typename boost::remove_reference<LT>::type::ConstIterator MatrixIterator;
362 typedef typename boost::remove_reference<RT>::type::ConstIterator VectorIterator;
365 if( x.nonZeros() == 0UL )
return;
374 DynamicVector<ElementType> tmp( (~lhs).
size() );
375 std::vector<bool> indices( (~lhs).
size(),
false );
376 size_t nonzeros( 0UL );
378 const VectorIterator vend ( x.end() );
379 VectorIterator velem( x.begin() );
381 for( ; velem!=vend; ++velem )
383 const MatrixIterator mend ( A.end( velem->index() ) );
384 MatrixIterator melem( A.begin( velem->index() ) );
386 for( ; melem!=mend; ++melem ) {
387 if( !indices[melem->index()] ) {
388 indices[melem->index()] =
true;
390 tmp[melem->index()] = melem->value() * velem->value();
393 tmp[melem->index()] += melem->value() * velem->value();
398 (~lhs).reserve( nonzeros );
400 for(
size_t i=0UL; i<(~lhs).
size(); ++i ) {
402 (~lhs).append( i, tmp[i] );
422 template<
typename VT1 >
427 typedef typename boost::remove_reference<LT>::type::ConstIterator MatrixIterator;
428 typedef typename boost::remove_reference<RT>::type::ConstIterator VectorIterator;
432 if( x.nonZeros() == 0UL )
return;
444 const VectorIterator vend ( x.end() );
445 VectorIterator velem( x.begin() );
447 for( ; velem!=vend; ++velem )
449 const MatrixIterator mend ( A.end( velem->index() ) );
450 MatrixIterator melem( A.begin( velem->index() ) );
452 for( ; melem!=mend; ++melem ) {
453 (~lhs)[melem->index()] += melem->value() * velem->value();
477 template<
typename VT1 >
482 typedef typename boost::remove_reference<LT>::type::ConstIterator MatrixIterator;
483 typedef typename boost::remove_reference<RT>::type::ConstIterator VectorIterator;
487 if( x.nonZeros() == 0UL )
return;
499 const VectorIterator vend ( x.end() );
500 VectorIterator velem( x.begin() );
502 for( ; velem!=vend; ++velem )
504 const MatrixIterator mend ( A.end( velem->index() ) );
505 MatrixIterator melem( A.begin( velem->index() ) );
507 for( ; melem!=mend; ++melem ) {
508 (~lhs)[melem->index()] -= melem->value() * velem->value();
532 template<
typename VT1 >
602 template<
typename T1
607 if( (~mat).
columns() != (~vec).size() )
608 throw std::invalid_argument(
"Matrix and vector sizes do not match" );