22 #ifndef _BLAZE_MATH_EXPRESSIONS_TSVECTSMATMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_TSVECTSMATMULTEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
77 typedef typename VT::ResultType
VRT;
78 typedef typename MT::ResultType
MRT;
79 typedef typename VT::CompositeType
VCT;
80 typedef typename MT::CompositeType
MCT;
134 typedef typename boost::remove_reference<VCT>::type::ConstIterator VectorIterator;
135 typedef typename boost::remove_reference<MCT>::type::ConstIterator MatrixIterator;
146 VectorIterator velem( x.begin() );
147 const VectorIterator vend( x.end() );
148 if( velem == vend ) {
153 MatrixIterator melem( A.begin(index) );
154 const MatrixIterator mend( A.end(index) );
155 if( melem == mend ) {
161 if( velem->index() < melem->index() ) {
163 if( velem == vend )
break;
165 else if( melem->index() < velem->index() ) {
167 if( melem == mend )
break;
170 res = velem->value() * melem->value();
177 if( melem != mend && velem != vend )
180 if( velem->index() < melem->index() ) {
182 if( velem == vend )
break;
184 else if( melem->index() < velem->index() ) {
186 if( melem == mend )
break;
189 res += velem->value() * melem->value();
191 if( velem == vend )
break;
193 if( melem == mend )
break;
208 return mat_.columns();
218 return mat_.columns();
248 template<
typename T >
275 template<
typename VT1 >
280 typedef typename boost::remove_reference<LT>::type::ConstIterator VectorIterator;
281 typedef typename boost::remove_reference<RT>::type::ConstIterator MatrixIterator;
288 if( x.nonZeros() == 0UL )
return;
300 const VectorIterator vend( x.end() );
302 for(
size_t j=0UL; j<A.columns(); ++j )
304 const MatrixIterator mend ( A.end(j) );
305 MatrixIterator melem( A.begin(j) );
307 if( melem == mend )
continue;
309 VectorIterator velem( x.begin() );
312 if( velem->index() < melem->index() ) {
314 if( velem == vend )
break;
316 else if( melem->index() < velem->index() ) {
318 if( melem == mend )
break;
321 (~lhs)[j] = velem->value() * melem->value();
328 if( velem != vend && melem != mend )
331 if( velem->index() < melem->index() ) {
333 if( velem == vend )
break;
335 else if( melem->index() < velem->index() ) {
337 if( melem == mend )
break;
340 (~lhs)[j] += velem->value() * melem->value();
342 if( velem == vend )
break;
344 if( melem == mend )
break;
366 template<
typename VT1 >
371 typedef typename boost::remove_reference<LT>::type::ConstIterator VectorIterator;
372 typedef typename boost::remove_reference<RT>::type::ConstIterator MatrixIterator;
376 if( x.nonZeros() == 0UL )
return;
389 const VectorIterator vend( x.end() );
391 for(
size_t j=0UL; j<A.columns(); ++j )
393 const MatrixIterator mend ( A.end(j) );
394 MatrixIterator melem( A.begin(j) );
396 if( melem == mend )
continue;
398 VectorIterator velem( x.begin() );
403 if( velem->index() < melem->index() ) {
405 if( velem == vend )
break;
407 else if( melem->index() < velem->index() ) {
409 if( melem == mend )
break;
412 accu = velem->value() * melem->value();
419 if( velem != vend && melem != mend )
422 if( velem->index() < melem->index() ) {
424 if( velem == vend )
break;
426 else if( melem->index() < velem->index() ) {
428 if( melem == mend )
break;
431 accu += velem->value() * melem->value();
433 if( velem == vend )
break;
435 if( melem == mend )
break;
441 (~lhs).insert( j, accu );
460 template<
typename VT1 >
465 typedef typename boost::remove_reference<LT>::type::ConstIterator VectorIterator;
466 typedef typename boost::remove_reference<RT>::type::ConstIterator MatrixIterator;
470 if( x.nonZeros() == 0UL )
return;
482 const VectorIterator vend( x.end() );
484 for(
size_t j=0UL; j<A.columns(); ++j )
486 const MatrixIterator mend ( A.end(j) );
487 MatrixIterator melem( A.begin(j) );
489 if( melem == mend )
continue;
491 VectorIterator velem( x.begin() );
494 if( velem->index() < melem->index() ) {
496 if( velem == vend )
break;
498 else if( melem->index() < velem->index() ) {
500 if( melem == mend )
break;
503 (~lhs)[j] += velem->value() * melem->value();
505 if( velem == vend )
break;
507 if( melem == mend )
break;
532 template<
typename VT1 >
537 typedef typename boost::remove_reference<LT>::type::ConstIterator VectorIterator;
538 typedef typename boost::remove_reference<RT>::type::ConstIterator MatrixIterator;
542 if( x.nonZeros() == 0UL )
return;
554 const VectorIterator vend( x.end() );
556 for(
size_t j=0UL; j<A.columns(); ++j )
558 const MatrixIterator mend ( A.end(j) );
559 MatrixIterator melem( A.begin(j) );
561 if( melem == mend )
continue;
563 VectorIterator velem( x.begin() );
566 if( velem->index() < melem->index() ) {
568 if( velem == vend )
break;
570 else if( melem->index() < velem->index() ) {
572 if( melem == mend )
break;
575 (~lhs)[j] -= velem->value() * melem->value();
577 if( velem == vend )
break;
579 if( melem == mend )
break;
604 template<
typename VT1 >
674 template<
typename T1
679 if( (~vec).size() != (~mat).
rows() )
680 throw std::invalid_argument(
"Vector and matrix sizes do not match" );