22 #ifndef _BLAZE_MATH_EXPRESSIONS_TSMATSMATMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_TSMATSMATMULTEXPR_H_
32 #include <boost/type_traits/remove_reference.hpp>
88 template<
typename MT1
96 typedef typename MT1::ResultType
RT1;
97 typedef typename MT2::ResultType
RT2;
98 typedef typename MT1::CompositeType
CT1;
99 typedef typename MT2::CompositeType
CT2;
152 if(
lhs_.columns() != 0UL ) {
154 for(
size_t k=1UL; k<
lhs_.columns(); ++k ) {
179 return rhs_.columns();
230 template<
typename T >
259 template<
typename MT
267 typedef typename boost::remove_reference<CT1>::type::ConstIterator LeftIterator;
268 typedef typename boost::remove_reference<CT2>::type::ConstIterator RightIterator;
280 for(
size_t j=0UL; j<A.columns(); ++j ) {
281 const LeftIterator lend( A.end(j) );
282 for( LeftIterator lelem=A.begin(j); lelem!=lend; ++lelem ) {
283 const RightIterator rend( B.end(j) );
284 for( RightIterator relem=B.begin(j); relem!=rend; ++relem )
286 if(
isDefault( (~lhs)(lelem->index(),relem->index()) ) ) {
287 (~lhs)(lelem->index(),relem->index()) = lelem->value() * relem->value();
290 (~lhs)(lelem->index(),relem->index()) += lelem->value() * relem->value();
313 template<
typename MT
321 typedef typename boost::remove_reference<CT1>::type::ConstIterator LeftIterator;
322 typedef typename boost::remove_reference<CT2>::type::ConstIterator RightIterator;
334 for(
size_t j=0UL; j<A.columns(); ++j ) {
335 const LeftIterator lend( A.end(j) );
336 for( LeftIterator lelem=A.begin(j); lelem!=lend; ++lelem ) {
337 const RightIterator rend( B.end(j) );
338 for( RightIterator relem=B.begin(j); relem!=rend; ++relem ) {
339 (~lhs)(lelem->index(),relem->index()) += lelem->value() * relem->value();
360 template<
typename MT >
368 const typename MT1::OppositeType tmp( rhs.lhs_ );
369 assign( ~lhs, tmp * rhs.rhs_ );
387 template<
typename MT >
395 const typename MT2::OppositeType tmp( rhs.rhs_ );
396 assign( ~lhs, rhs.lhs_ * tmp );
414 template<
typename MT
421 typedef typename boost::remove_reference<CT1>::type::ConstIterator LeftIterator;
422 typedef typename boost::remove_reference<CT2>::type::ConstIterator RightIterator;
434 for(
size_t j=0UL; j<A.columns(); ++j ) {
435 const LeftIterator lend( A.end(j) );
436 for( LeftIterator lelem=A.begin(j); lelem!=lend; ++lelem ) {
437 const RightIterator rend( B.end(j) );
438 for( RightIterator relem=B.begin(j); relem!=rend; ++relem ) {
439 (~lhs)(lelem->index(),relem->index()) += lelem->value() * relem->value();
464 template<
typename MT
471 typedef typename boost::remove_reference<CT1>::type::ConstIterator LeftIterator;
472 typedef typename boost::remove_reference<CT2>::type::ConstIterator RightIterator;
484 for(
size_t j=0UL; j<A.columns(); ++j ) {
485 const LeftIterator lend( A.end(j) );
486 for( LeftIterator lelem=A.begin(j); lelem!=lend; ++lelem ) {
487 const RightIterator rend( B.end(j) );
488 for( RightIterator relem=B.begin(j); relem!=rend; ++relem ) {
489 (~lhs)(lelem->index(),relem->index()) -= lelem->value() * relem->value();
559 template<
typename T1
565 throw std::invalid_argument(
"Matrix sizes do not match" );
582 template<
typename MT1,
typename MT2,
typename VT >
587 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
588 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
589 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value
590 ,
typename TSMatDVecMultExprTrait< MT1, typename SMatDVecMultExprTrait<MT2,VT>::Type >::Type
591 , INVALID_TYPE >::Type Type;
600 template<
typename MT1,
typename MT2,
typename VT >
605 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
606 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
607 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value
608 ,
typename TSMatDVecMultExprTrait< MT1, typename SMatDVecMultExprTrait<MT2,VT>::Type >::Type
609 , INVALID_TYPE >::Type Type;
618 template<
typename VT,
typename MT1,
typename MT2 >
623 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
624 IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
625 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value
626 ,
typename TDVecSMatMultExprTrait< typename TDVecTSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
627 , INVALID_TYPE >::Type Type;
636 template<
typename VT,
typename MT1,
typename MT2 >
641 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
642 IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
643 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value
644 ,
typename TDVecSMatMultExprTrait< typename TDVecTSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
645 , INVALID_TYPE >::Type Type;