22 #ifndef _BLAZE_MATH_EXPRESSIONS_DMATTDMATSUBEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_DMATTDMATSUBEXPR_H_
66 template<
typename MT1
74 typedef typename MT1::ResultType
RT1;
75 typedef typename MT2::ResultType
RT2;
76 typedef typename MT1::ReturnType
RN1;
77 typedef typename MT2::ReturnType
RN2;
78 typedef typename MT1::CompositeType
CT1;
79 typedef typename MT2::CompositeType
CT2;
118 enum { vectorizable = 0 };
166 return lhs_.columns();
196 template<
typename T >
209 template<
typename T >
211 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
233 template<
typename MT
246 const size_t m( rhs.
rows() );
247 const size_t n( rhs.
columns() );
248 const size_t block( 16UL );
250 for(
size_t ii=0UL; ii<m; ii+=block ) {
251 const size_t iend( ( m < ii+block )?( m ):( ii+block ) );
252 for(
size_t jj=0UL; jj<n; jj+=block ) {
253 const size_t jend( ( n < jj+block )?( n ):( jj+block ) );
254 for(
size_t i=ii; i<iend; ++i ) {
255 for(
size_t j=jj; j<jend; ++j ) {
256 (~lhs)(i,j) = rhs.
lhs_(i,j) - rhs.
rhs_(i,j);
289 template<
typename MT
307 const TmpType tmp( rhs );
326 template<
typename MT
337 if( !RequiresEvaluation<MT1>::value && !RequiresEvaluation<MT2>::value )
339 const size_t m( rhs.rows() );
340 const size_t n( rhs.columns() );
341 const size_t block( 16UL );
343 for(
size_t ii=0UL; ii<m; ii+=block ) {
344 const size_t iend( ( m < ii+block )?( m ):( ii+block ) );
345 for(
size_t jj=0UL; jj<n; jj+=block ) {
346 const size_t jend( ( n < jj+block )?( n ):( jj+block ) );
347 for(
size_t i=ii; i<iend; ++i ) {
348 for(
size_t j=jj; j<jend; ++j ) {
349 (~lhs)(i,j) += rhs.lhs_(i,j) - rhs.rhs_(i,j);
384 template<
typename MT
395 if( !RequiresEvaluation<MT1>::value && !RequiresEvaluation<MT2>::value )
397 const size_t m( rhs.rows() );
398 const size_t n( rhs.columns() );
399 const size_t block( 16UL );
401 for(
size_t ii=0UL; ii<m; ii+=block ) {
402 const size_t iend( ( m < ii+block )?( m ):( ii+block ) );
403 for(
size_t jj=0UL; jj<n; jj+=block ) {
404 const size_t jend( ( n < jj+block )?( n ):( jj+block ) );
405 for(
size_t i=ii; i<iend; ++i ) {
406 for(
size_t j=jj; j<jend; ++j ) {
407 (~lhs)(i,j) -= rhs.lhs_(i,j) - rhs.rhs_(i,j);
485 template<
typename T1
487 inline const DMatTDMatSubExpr<T1,T2>
493 throw std::invalid_argument(
"Matrix sizes do not match" );
529 template<
typename T1
531 inline const DMatTDMatSubExpr<T1,T2>
537 throw std::invalid_argument(
"Matrix sizes do not match" );
554 template<
typename MT1,
typename MT2 >
555 struct RowExprTrait< DMatTDMatSubExpr<MT1,MT2> >
559 typedef typename SubExprTrait< typename RowExprTrait<const MT1>::Type
560 ,
typename RowExprTrait<const MT2>::Type >::Type Type;
569 template<
typename MT1,
typename MT2 >
570 struct ColumnExprTrait< DMatTDMatSubExpr<MT1,MT2> >
574 typedef typename SubExprTrait< typename ColumnExprTrait<const MT1>::Type
575 ,
typename ColumnExprTrait<const MT2>::Type >::Type Type;