22 #ifndef _BLAZE_MATH_EXPRESSIONS_TSMATSVECMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_TSMATSVECMULTEXPR_H_
75 class TSMatSVecMultExpr :
public SparseVector< TSMatSVecMultExpr<MT,VT>, false >
76 ,
private MatVecMultExpr
81 typedef typename MT::ResultType
MRT;
82 typedef typename VT::ResultType
VRT;
83 typedef typename MT::CompositeType
MCT;
84 typedef typename VT::CompositeType
VCT;
146 const VectorIterator vend( x.end() );
147 VectorIterator velem( x.begin() );
149 if(
vec_.size() > 0UL && velem != vend ) {
150 res = A( index, velem->index() ) * velem->value();
152 for( ; velem!=vend; ++velem )
153 res += A( index, velem->index() ) * velem->value();
209 template<
typename T >
211 return (
mat_.isAliased( alias ) ||
vec_.isAliased( alias ) );
221 template<
typename T >
223 return (
mat_.isAliased( alias ) ||
vec_.isAliased( alias ) );
247 template<
typename VT1 >
263 if( x.nonZeros() == 0UL )
return;
275 const VectorIterator vend ( x.end() );
276 VectorIterator velem( x.begin() );
278 for( ; velem!=vend; ++velem )
280 const MatrixIterator mend ( A.end( velem->index() ) );
281 MatrixIterator melem( A.begin( velem->index() ) );
283 for( ; melem!=mend; ++melem ) {
284 if(
isDefault( (~lhs)[melem->index()] ) )
285 (~lhs)[melem->index()] = melem->value() * velem->value();
287 (~lhs)[melem->index()] += melem->value() * velem->value();
308 template<
typename VT1 >
324 if( x.nonZeros() == 0UL )
return;
336 const VectorIterator vend ( x.end() );
337 VectorIterator velem( x.begin() );
339 for( ; velem!=vend; ++velem )
341 const MatrixIterator mend ( A.end( velem->index() ) );
342 MatrixIterator melem( A.begin( velem->index() ) );
344 for( ; melem!=mend; ++melem ) {
345 (~lhs)[melem->index()] += melem->value() * velem->value();
364 template<
typename VT1 >
371 typedef typename RemoveReference<LT>::Type::ConstIterator MatrixIterator;
372 typedef typename RemoveReference<RT>::Type::ConstIterator VectorIterator;
375 if( x.nonZeros() == 0UL )
return;
384 DynamicVector<ElementType> tmp( (~lhs).
size() );
385 std::vector<bool> indices( (~lhs).
size(),
false );
386 size_t nonzeros( 0UL );
388 const VectorIterator vend ( x.end() );
389 VectorIterator velem( x.begin() );
391 for( ; velem!=vend; ++velem )
393 const MatrixIterator mend ( A.end( velem->index() ) );
394 MatrixIterator melem( A.begin( velem->index() ) );
396 for( ; melem!=mend; ++melem ) {
397 if( !indices[melem->index()] ) {
398 indices[melem->index()] =
true;
400 tmp[melem->index()] = melem->value() * velem->value();
403 tmp[melem->index()] += melem->value() * velem->value();
408 (~lhs).reserve( nonzeros );
410 for(
size_t i=0UL; i<(~lhs).
size(); ++i ) {
412 (~lhs).append( i, tmp[i] );
432 template<
typename VT1 >
439 typedef typename RemoveReference<LT>::Type::ConstIterator MatrixIterator;
440 typedef typename RemoveReference<RT>::Type::ConstIterator VectorIterator;
444 if( x.nonZeros() == 0UL )
return;
456 const VectorIterator vend ( x.end() );
457 VectorIterator velem( x.begin() );
459 for( ; velem!=vend; ++velem )
461 const MatrixIterator mend ( A.end( velem->index() ) );
462 MatrixIterator melem( A.begin( velem->index() ) );
464 for( ; melem!=mend; ++melem ) {
465 (~lhs)[melem->index()] += melem->value() * velem->value();
489 template<
typename VT1 >
496 typedef typename RemoveReference<LT>::Type::ConstIterator MatrixIterator;
497 typedef typename RemoveReference<RT>::Type::ConstIterator VectorIterator;
501 if( x.nonZeros() == 0UL )
return;
513 const VectorIterator vend ( x.end() );
514 VectorIterator velem( x.begin() );
516 for( ; velem!=vend; ++velem )
518 const MatrixIterator mend ( A.end( velem->index() ) );
519 MatrixIterator melem( A.begin( velem->index() ) );
521 for( ; melem!=mend; ++melem ) {
522 (~lhs)[melem->index()] -= melem->value() * velem->value();
546 template<
typename VT1 >
618 template<
typename T1
620 inline const typename DisableIf< IsMatMatMultExpr<T1>, TSMatSVecMultExpr<T1,T2> >::Type
625 if( (~mat).
columns() != (~vec).size() )
626 throw std::invalid_argument(
"Matrix and vector sizes do not match" );