22 #ifndef _BLAZE_MATH_EXPRESSIONS_TSVECTSMATMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_TSVECTSMATMULTEXPR_H_
72 class TSVecTSMatMultExpr :
public SparseVector< TSVecTSMatMultExpr<VT,MT>, true >
73 ,
private TVecMatMultExpr
78 typedef typename VT::ResultType
VRT;
79 typedef typename MT::ResultType
MRT;
80 typedef typename VT::CompositeType
VCT;
81 typedef typename MT::CompositeType
MCT;
141 VectorIterator velem( x.begin() );
142 const VectorIterator vend( x.end() );
143 if( velem == vend ) {
148 MatrixIterator melem( A.begin(index) );
149 const MatrixIterator mend( A.end(index) );
150 if( melem == mend ) {
156 if( velem->index() < melem->index() ) {
158 if( velem == vend )
break;
160 else if( melem->index() < velem->index() ) {
162 if( melem == mend )
break;
165 res = velem->value() * melem->value();
172 if( melem != mend && velem != vend )
175 if( velem->index() < melem->index() ) {
177 if( velem == vend )
break;
179 else if( melem->index() < velem->index() ) {
181 if( melem == mend )
break;
184 res += velem->value() * melem->value();
186 if( velem == vend )
break;
188 if( melem == mend )
break;
203 return mat_.columns();
213 return mat_.columns();
243 template<
typename T >
245 return (
vec_.isAliased( alias ) ||
mat_.isAliased( alias ) );
255 template<
typename T >
257 return (
vec_.isAliased( alias ) ||
mat_.isAliased( alias ) );
280 template<
typename VT1 >
295 if( x.nonZeros() == 0UL )
return;
307 const VectorIterator vend( x.end() );
309 for(
size_t j=0UL; j<A.columns(); ++j )
311 const MatrixIterator mend ( A.end(j) );
312 MatrixIterator melem( A.begin(j) );
314 if( melem == mend )
continue;
316 VectorIterator velem( x.begin() );
319 if( velem->index() < melem->index() ) {
321 if( velem == vend )
break;
323 else if( melem->index() < velem->index() ) {
325 if( melem == mend )
break;
328 (~lhs)[j] = velem->value() * melem->value();
335 if( velem != vend && melem != mend )
338 if( velem->index() < melem->index() ) {
340 if( velem == vend )
break;
342 else if( melem->index() < velem->index() ) {
344 if( melem == mend )
break;
347 (~lhs)[j] += velem->value() * melem->value();
349 if( velem == vend )
break;
351 if( melem == mend )
break;
373 template<
typename VT1 >
385 if( x.nonZeros() == 0UL )
return;
398 const VectorIterator vend( x.end() );
400 for(
size_t j=0UL; j<A.columns(); ++j )
402 const MatrixIterator mend ( A.end(j) );
403 MatrixIterator melem( A.begin(j) );
405 if( melem == mend )
continue;
407 VectorIterator velem( x.begin() );
412 if( velem->index() < melem->index() ) {
414 if( velem == vend )
break;
416 else if( melem->index() < velem->index() ) {
418 if( melem == mend )
break;
421 accu = velem->value() * melem->value();
428 if( velem != vend && melem != mend )
431 if( velem->index() < melem->index() ) {
433 if( velem == vend )
break;
435 else if( melem->index() < velem->index() ) {
437 if( melem == mend )
break;
440 accu += velem->value() * melem->value();
442 if( velem == vend )
break;
444 if( melem == mend )
break;
450 (~lhs).insert( j, accu );
469 template<
typename VT1 >
476 typedef typename RemoveReference<LT>::Type::ConstIterator VectorIterator;
477 typedef typename RemoveReference<RT>::Type::ConstIterator MatrixIterator;
481 if( x.nonZeros() == 0UL )
return;
493 const VectorIterator vend( x.end() );
495 for(
size_t j=0UL; j<A.columns(); ++j )
497 const MatrixIterator mend ( A.end(j) );
498 MatrixIterator melem( A.begin(j) );
500 if( melem == mend )
continue;
502 VectorIterator velem( x.begin() );
505 if( velem->index() < melem->index() ) {
507 if( velem == vend )
break;
509 else if( melem->index() < velem->index() ) {
511 if( melem == mend )
break;
514 (~lhs)[j] += velem->value() * melem->value();
516 if( velem == vend )
break;
518 if( melem == mend )
break;
543 template<
typename VT1 >
550 typedef typename RemoveReference<LT>::Type::ConstIterator VectorIterator;
551 typedef typename RemoveReference<RT>::Type::ConstIterator MatrixIterator;
555 if( x.nonZeros() == 0UL )
return;
567 const VectorIterator vend( x.end() );
569 for(
size_t j=0UL; j<A.columns(); ++j )
571 const MatrixIterator mend ( A.end(j) );
572 MatrixIterator melem( A.begin(j) );
574 if( melem == mend )
continue;
576 VectorIterator velem( x.begin() );
579 if( velem->index() < melem->index() ) {
581 if( velem == vend )
break;
583 else if( melem->index() < velem->index() ) {
585 if( melem == mend )
break;
588 (~lhs)[j] -= velem->value() * melem->value();
590 if( velem == vend )
break;
592 if( melem == mend )
break;
617 template<
typename VT1 >
689 template<
typename T1
691 inline const typename DisableIf< IsMatMatMultExpr<T2>, TSVecTSMatMultExpr<T1,T2> >::Type
696 if( (~vec).size() != (~mat).
rows() )
697 throw std::invalid_argument(
"Vector and matrix sizes do not match" );