22 #ifndef _BLAZE_MATH_EXPRESSIONS_TSVECTDMATMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_TSVECTDMATMULTEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
73 class TSVecTDMatMultExpr :
public DenseVector< TSVecTDMatMultExpr<VT,MT>, true >
79 typedef typename VT::ResultType
VRT;
80 typedef typename MT::ResultType
MRT;
81 typedef typename VT::CompositeType
VCT;
82 typedef typename MT::CompositeType
MCT;
99 template<
typename VT2 >
101 enum { value = useAssign };
132 enum { vectorizable = 0 };
158 typedef typename boost::remove_reference<VCT>::type::ConstIterator ConstIterator;
164 const ConstIterator end( x.end() );
165 ConstIterator element( x.begin() );
168 if( element != end ) {
169 res = element->value() *
mat_( element->index(), index );
171 for( ; element!=end; ++element )
172 res += element->value() *
mat_( element->index(), index );
188 return mat_.columns();
218 template<
typename T >
220 return vec_.isAliased( alias ) ||
mat_.isAliased( alias );
230 template<
typename T >
232 return vec_.isAliased( alias ) ||
mat_.isAliased( alias );
258 template<
typename VT2 >
266 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
270 if( x.nonZeros() == 0UL ) {
285 const ConstIterator end( x.end() );
287 for(
size_t i=0UL; i<(~lhs).
size(); ++i )
289 ConstIterator element( x.begin() );
291 (~lhs)[i] = element->value() * A(element->index(),i);
293 for( ; element!=end; ++element ) {
294 (~lhs)[i] += element->value() * A(element->index(),i);
314 template<
typename VT2 >
325 const ResultType tmp( rhs );
342 template<
typename VT2 >
349 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
353 if( x.nonZeros() == 0UL )
return;
365 const ConstIterator end( x.end() );
366 ConstIterator element( x.begin() );
368 for( ; element!=end; ++element ) {
369 for(
size_t i=0UL; i<A.columns(); ++i ) {
370 (~lhs)[i] += element->value() * A(element->index(),i);
391 template<
typename VT2 >
398 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
402 if( x.nonZeros() == 0UL )
return;
414 const ConstIterator end( x.end() );
415 ConstIterator element( x.begin() );
417 for( ; element!=end; ++element ) {
418 for(
size_t i=0UL; i<A.columns(); ++i ) {
419 (~lhs)[i] -= element->value() * A(element->index(),i);
440 template<
typename VT2 >
451 const ResultType tmp( rhs );
511 template<
typename T1,
typename T2 >
512 inline const typename DisableIf< IsMatMatMultExpr<T2>, TSVecTDMatMultExpr<T1,T2> >::Type
517 if( (~vec).
size() != (~mat).
rows() )
518 throw std::invalid_argument(
"Vector and matrix sizes do not match" );