22 #ifndef _BLAZE_MATH_EXPRESSIONS_TSVECSMATMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_TSVECSMATMULTEXPR_H_
74 class TSVecSMatMultExpr :
public SparseVector< TSVecSMatMultExpr<VT,MT>, true >
75 ,
private TVecMatMultExpr
80 typedef typename VT::ResultType
VRT;
81 typedef typename MT::ResultType
MRT;
82 typedef typename VT::CompositeType
VCT;
83 typedef typename MT::CompositeType
MCT;
141 const VectorIterator vend( x.end() );
142 VectorIterator velem( x.begin() );
145 if( velem != vend ) {
146 res = velem->value() * A(velem->index(),index);
148 for( ; velem!=vend; ++velem ) {
149 res += velem->value() * A(velem->index(),index);
166 return mat_.columns();
176 return mat_.columns();
206 template<
typename T >
208 return (
vec_.isAliased( alias ) ||
mat_.isAliased( alias ) );
218 template<
typename T >
220 return (
vec_.isAliased( alias ) ||
mat_.isAliased( alias ) );
244 template<
typename VT1 >
257 if( x.nonZeros() == 0UL ) {
272 const VectorIterator vend( x.end() );
274 for(
size_t i=0UL; i<(~lhs).
size(); ++i )
276 VectorIterator velem( x.begin() );
278 (~lhs)[i] = velem->value() * A(velem->index(),i);
280 for( ; velem!=vend; ++velem ) {
281 (~lhs)[i] += velem->value() * A(velem->index(),i);
302 template<
typename VT1 >
318 if( x.nonZeros() == 0UL )
return;
330 const VectorIterator vend( x.end() );
331 VectorIterator velem( x.begin() );
333 for( ; velem!=vend; ++velem )
335 const MatrixIterator mend( A.end( velem->index() ) );
336 MatrixIterator melem( A.begin( velem->index() ) );
338 for( ; melem!=mend; ++melem ) {
339 (~lhs)[melem->index()] += velem->value() * melem->value();
358 template<
typename VT1 >
365 typedef typename RemoveReference<LT>::Type::ConstIterator VectorIterator;
366 typedef typename RemoveReference<RT>::Type::ConstIterator MatrixIterator;
370 if( x.nonZeros() == 0UL )
return;
382 const VectorIterator vend( x.end() );
383 VectorIterator velem( x.begin() );
385 for( ; velem!=vend; ++velem )
387 const MatrixIterator mend( A.end( velem->index() ) );
388 MatrixIterator melem( A.begin( velem->index() ) );
390 for( ; melem!=mend; ++melem )
392 typename VT1::Iterator pos( (~lhs).find( melem->index() ) );
393 if( pos != (~lhs).end() )
394 pos->value() += velem->value() * melem->value();
396 (~lhs).insert( melem->index(), velem->value() * melem->value() );
416 template<
typename VT1 >
423 typedef typename RemoveReference<LT>::Type::ConstIterator VectorIterator;
424 typedef typename RemoveReference<RT>::Type::ConstIterator MatrixIterator;
428 if( x.nonZeros() == 0UL )
return;
440 const VectorIterator vend( x.end() );
441 VectorIterator velem( x.begin() );
443 for( ; velem!=vend; ++velem )
445 const MatrixIterator mend( A.end( velem->index() ) );
446 MatrixIterator melem( A.begin( velem->index() ) );
448 for( ; melem!=mend; ++melem ) {
449 (~lhs)[melem->index()] += velem->value() * melem->value();
473 template<
typename VT1 >
480 typedef typename RemoveReference<LT>::Type::ConstIterator VectorIterator;
481 typedef typename RemoveReference<RT>::Type::ConstIterator MatrixIterator;
485 if( x.nonZeros() == 0UL )
return;
497 const VectorIterator vend( x.end() );
498 VectorIterator velem( x.begin() );
500 for( ; velem!=vend; ++velem )
502 const MatrixIterator mend( A.end( velem->index() ) );
503 MatrixIterator melem( A.begin( velem->index() ) );
505 for( ; melem!=mend; ++melem ) {
506 (~lhs)[melem->index()] -= velem->value() * melem->value();
530 template<
typename VT1 >
602 template<
typename T1
604 inline const typename DisableIf< IsMatMatMultExpr<T2>, TSVecSMatMultExpr<T1,T2> >::Type
609 if( (~vec).size() != (~mat).
rows() )
610 throw std::invalid_argument(
"Vector and matrix sizes do not match" );
638 template<
typename T1
641 inline const typename EnableIf< IsMatMatMultExpr<T2>, MultExprTrait<T1,T2> >::Type::Type
646 return ( vec * (~mat).leftOperand() ) * (~mat).rightOperand();