22 #ifndef _BLAZE_MATH_EXPRESSIONS_TDVECSMATMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_TDVECSMATMULTEXPR_H_
74 class TDVecSMatMultExpr :
public DenseVector< TDVecSMatMultExpr<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;
110 enum { vectorizable = 0 };
135 if(
vec_.size() != 0UL ) {
137 for(
size_t i=1UL; i<
vec_.size(); ++i ) {
155 return mat_.columns();
185 template<
typename T >
187 return (
vec_.isAliased( alias ) ||
mat_.isAliased( alias ) );
197 template<
typename T >
199 return (
vec_.isAliased( alias ) ||
mat_.isAliased( alias ) );
221 template<
typename VT2 >
229 if( rhs.mat_.rows() == 0UL ) {
242 for(
size_t i=0; i<(~lhs).
size(); ++i ) {
243 (~lhs)[i] = x[0UL] * A(0UL,i);
244 for(
size_t j=1UL; j<x.size(); ++j ) {
245 (~lhs)[i] += x[j] * A(j,i);
263 template<
typename VT2 >
273 if( rhs.mat_.rows() == 0UL ) {
288 for(
size_t i=0UL; i<x.size(); ++i ) {
289 const ConstIterator end( A.end(i) );
290 ConstIterator element( A.begin(i) );
291 for( ; element!=end; ++element ) {
292 (~lhs)[element->index()] += x[i] * element->value();
308 template<
typename VT2 >
335 template<
typename VT2 >
344 if( rhs.mat_.rows() == 0UL ) {
356 for(
size_t i=0UL; i<x.size(); ++i ) {
357 const ConstIterator end( A.end(i) );
358 ConstIterator element( A.begin(i) );
359 for( ; element!=end; ++element ) {
360 (~lhs)[element->index()] += x[i] * element->value();
381 template<
typename VT2 >
390 if( rhs.mat_.rows() == 0UL ) {
402 for(
size_t i=0UL; i<x.size(); ++i ) {
403 const ConstIterator end( A.end(i) );
404 ConstIterator element( A.begin(i) );
405 for( ; element!=end; ++element ) {
406 (~lhs)[element->index()] -= x[i] * element->value();
427 template<
typename VT2 >
498 template<
typename T1
500 inline const typename DisableIf< IsMatMatMultExpr<T2>, TDVecSMatMultExpr<T1,T2> >::Type
505 if( (~vec).size() != (~mat).
rows() )
506 throw std::invalid_argument(
"Vector and matrix sizes do not match" );
534 template<
typename T1
537 inline const typename EnableIf< IsMatMatMultExpr<T2>, MultExprTrait<T1,T2> >::Type::Type
542 return ( vec * (~mat).leftOperand() ) * (~mat).rightOperand();