22 #ifndef _BLAZE_MATH_EXPRESSIONS_SMATTSMATMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SMATTSMATMULTEXPR_H_
82 template<
typename MT1
84 class SMatTSMatMultExpr :
public SparseMatrix< SMatTSMatMultExpr<MT1,MT2>, false >
85 ,
private MatMatMultExpr
90 typedef typename MT1::ResultType
RT1;
91 typedef typename MT2::ResultType
RT2;
92 typedef typename MT1::CompositeType
CT1;
93 typedef typename MT2::CompositeType
CT2;
144 if(
lhs_.columns() == 0UL )
154 const LeftIterator lend( A.end(i) );
155 LeftIterator lelem( A.begin(i) );
160 const RightIterator rend( B.end(j) );
161 RightIterator relem( B.begin(j) );
164 if( lelem == lend || relem == rend )
169 if( lelem->index() < relem->index() ) {
171 if( lelem == lend )
break;
173 else if( relem->index() < lelem->index() ) {
175 if( relem == rend )
break;
178 tmp = lelem->value() * relem->value();
185 if( lelem != lend && relem != rend )
188 if( lelem->index() < relem->index() ) {
190 if( lelem == lend )
break;
192 else if( relem->index() < lelem->index() ) {
194 if( relem == rend )
break;
197 tmp += lelem->value() * relem->value();
199 if( lelem == lend )
break;
201 if( relem == rend )
break;
213 const LeftIterator end( A.end(i) );
214 LeftIterator element( A.begin(i) );
221 tmp = element->value() *
rhs_(element->index(),j);
223 for( ; element!=end; ++element )
224 tmp += element->value() *
rhs_(element->index(),j);
233 const RightIterator end( B.end(j) );
234 RightIterator element( B.begin(j) );
241 tmp =
lhs_(i,element->index()) * element->value();
243 for( ; element!=end; ++element )
244 tmp +=
lhs_(i,element->index()) * element->value();
250 for(
size_t k=1UL; k<
lhs_.columns(); ++k ) {
275 return rhs_.columns();
327 template<
typename T >
329 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
339 template<
typename T >
341 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
364 template<
typename MT >
374 const typename MT2::OppositeType tmp( rhs.rhs_ );
375 assign( ~lhs, rhs.lhs_ * tmp );
393 template<
typename MT >
403 const typename MT1::OppositeType tmp( rhs.lhs_ );
404 assign( ~lhs, tmp * rhs.rhs_ );
422 template<
typename MT >
432 const typename MT2::OppositeType tmp( rhs.rhs_ );
433 assign( ~lhs, rhs.lhs_ * tmp );
451 template<
typename MT >
461 const typename MT1::OppositeType tmp( rhs.lhs_ );
462 assign( ~lhs, tmp * rhs.rhs_ );
480 template<
typename MT >
490 const typename MT2::OppositeType tmp( rhs.rhs_ );
509 template<
typename MT >
519 const typename MT1::OppositeType tmp( rhs.lhs_ );
542 template<
typename MT >
552 const typename MT2::OppositeType tmp( rhs.rhs_ );
571 template<
typename MT >
581 const typename MT1::OppositeType tmp( rhs.lhs_ );
649 template<
typename T1
651 inline const SMatTSMatMultExpr<T1,T2>
657 throw std::invalid_argument(
"Matrix sizes do not match" );
674 template<
typename MT1,
typename MT2,
typename VT >
675 struct SMatDVecMultExprTrait< SMatTSMatMultExpr<MT1,MT2>, VT >
679 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
680 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
681 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value
682 ,
typename SMatDVecMultExprTrait< MT1, typename TSMatDVecMultExprTrait<MT2,VT>::Type >::Type
683 , INVALID_TYPE >::Type Type;
692 template<
typename MT1,
typename MT2,
typename VT >
693 struct SMatSVecMultExprTrait< SMatTSMatMultExpr<MT1,MT2>, VT >
697 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
698 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
699 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value
700 ,
typename SMatSVecMultExprTrait< MT1, typename TSMatSVecMultExprTrait<MT2,VT>::Type >::Type
701 , INVALID_TYPE >::Type Type;
710 template<
typename VT,
typename MT1,
typename MT2 >
711 struct TDVecSMatMultExprTrait< VT, SMatTSMatMultExpr<MT1,MT2> >
715 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
716 IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
717 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value
718 ,
typename TDVecTSMatMultExprTrait< typename TDVecSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
719 , INVALID_TYPE >::Type Type;
728 template<
typename VT,
typename MT1,
typename MT2 >
729 struct TSVecSMatMultExprTrait< VT, SMatTSMatMultExpr<MT1,MT2> >
733 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
734 IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
735 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value
736 ,
typename TDVecTSMatMultExprTrait< typename TDVecSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
737 , INVALID_TYPE >::Type Type;
746 template<
typename MT1,
typename MT2 >
747 struct RowExprTrait< SMatTSMatMultExpr<MT1,MT2> >
751 typedef typename MultExprTrait< typename RowExprTrait<const MT1>::Type, MT2 >::Type Type;
760 template<
typename MT1,
typename MT2 >
761 struct ColumnExprTrait< SMatTSMatMultExpr<MT1,MT2> >
765 typedef typename MultExprTrait< MT1, typename ColumnExprTrait<const MT2>::Type >::Type Type;