22 #ifndef _BLAZE_MATH_EXPRESSIONS_SMATTSMATMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SMATTSMATMULTEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
78 template<
typename MT1
86 typedef typename MT1::ResultType
RT1;
87 typedef typename MT2::ResultType
RT2;
88 typedef typename MT1::CompositeType
CT1;
89 typedef typename MT2::CompositeType
CT2;
140 typedef typename boost::remove_reference<CT1>::type::ConstIterator LeftIterator;
141 typedef typename boost::remove_reference<CT2>::type::ConstIterator RightIterator;
146 if(
lhs_.columns() == 0UL )
156 const LeftIterator lend( A.end(i) );
157 LeftIterator lelem( A.begin(i) );
162 const RightIterator rend( B.end(j) );
163 RightIterator relem( B.begin(j) );
166 if( lelem == lend || relem == rend )
171 if( lelem->index() < relem->index() ) {
173 if( lelem == lend )
break;
175 else if( relem->index() < lelem->index() ) {
177 if( relem == rend )
break;
180 tmp = lelem->value() * relem->value();
187 if( lelem != lend && relem != rend )
190 if( lelem->index() < relem->index() ) {
192 if( lelem == lend )
break;
194 else if( relem->index() < lelem->index() ) {
196 if( relem == rend )
break;
199 tmp += lelem->value() * relem->value();
201 if( lelem == lend )
break;
203 if( relem == rend )
break;
215 const LeftIterator end( A.end(i) );
216 LeftIterator element( A.begin(i) );
223 tmp = element->value() *
rhs_(element->index(),j);
225 for( ; element!=end; ++element )
226 tmp += element->value() *
rhs_(element->index(),j);
235 const RightIterator end( B.end(j) );
236 RightIterator element( B.begin(j) );
243 tmp =
lhs_(i,element->index()) * element->value();
245 for( ; element!=end; ++element )
246 tmp +=
lhs_(i,element->index()) * element->value();
252 for(
size_t k=1UL; k<
lhs_.columns(); ++k ) {
277 return rhs_.columns();
328 template<
typename T >
356 template<
typename MT >
364 const typename MT2::OppositeType tmp( rhs.
rhs_ );
383 template<
typename MT >
391 const typename MT1::OppositeType tmp( rhs.
lhs_ );
410 template<
typename MT >
418 const typename MT2::OppositeType tmp( rhs.rhs_ );
419 assign( ~lhs, rhs.lhs_ * tmp );
437 template<
typename MT >
445 const typename MT1::OppositeType tmp( rhs.lhs_ );
446 assign( ~lhs, tmp * rhs.rhs_ );
464 template<
typename MT >
472 const typename MT2::OppositeType tmp( rhs.rhs_ );
491 template<
typename MT >
499 const typename MT1::OppositeType tmp( rhs.lhs_ );
522 template<
typename MT >
530 const typename MT2::OppositeType tmp( rhs.rhs_ );
549 template<
typename MT >
557 const typename MT1::OppositeType tmp( rhs.lhs_ );
625 template<
typename T1
631 throw std::invalid_argument(
"Matrix sizes do not match" );
648 template<
typename MT1,
typename MT2,
typename VT >
653 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
654 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
655 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value
656 ,
typename SMatDVecMultExprTrait< MT1, typename TSMatDVecMultExprTrait<MT2,VT>::Type >::Type
657 , INVALID_TYPE >::Type Type;
666 template<
typename MT1,
typename MT2,
typename VT >
671 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
672 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
673 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value
674 ,
typename SMatSVecMultExprTrait< MT1, typename TSMatSVecMultExprTrait<MT2,VT>::Type >::Type
675 , INVALID_TYPE >::Type Type;
684 template<
typename VT,
typename MT1,
typename MT2 >
689 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
690 IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
691 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value
692 ,
typename TDVecTSMatMultExprTrait< typename TDVecSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
693 , INVALID_TYPE >::Type Type;
702 template<
typename VT,
typename MT1,
typename MT2 >
707 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
708 IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
709 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value
710 ,
typename TDVecTSMatMultExprTrait< typename TDVecSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
711 , INVALID_TYPE >::Type Type;