22 #ifndef _BLAZE_MATH_EXPRESSIONS_DMATTRANSPOSER_H_
23 #define _BLAZE_MATH_EXPRESSIONS_DMATTRANSPOSER_H_
74 enum { vectorizable = MT::vectorizable };
117 return dm_.columns();
137 return dm_.spacing();
157 template<
typename Other >
160 return dm_.isAliased( alias );
175 template<
typename MT2 >
183 const size_t m(
rows() );
187 const size_t end( n &
size_t(-2) );
189 for(
size_t i=0UL; i<m; ++i ) {
190 for(
size_t j=0UL; j<end; j+=2UL ) {
191 dm_(j ,i) = (~rhs)(i,j );
192 dm_(j+1UL,i) = (~rhs)(i,j+1UL);
195 dm_(end,i) = (~rhs)(i,end);
212 template<
typename MT2 >
220 const size_t m(
rows() );
222 const size_t block( 16UL );
224 for(
size_t ii=0UL; ii<m; ii+=block ) {
225 const size_t iend( ( m < ii+block )?( m ):( ii+block ) );
226 for(
size_t jj=0UL; jj<n; jj+=block ) {
227 const size_t jend( ( n < jj+block )?( n ):( jj+block ) );
228 for(
size_t i=ii; i<iend; ++i ) {
229 for(
size_t j=jj; j<jend; ++j ) {
230 dm_(j,i) = (~rhs)(i,j);
249 template<
typename MT2 >
257 typedef typename MT2::ConstIterator ConstIterator;
259 for(
size_t i=0UL; i<(~rhs).
rows(); ++i )
260 for( ConstIterator element=(~rhs).begin(i); element!=(~rhs).end(i); ++element )
261 dm_(element->index(),i) = element->value();
276 template<
typename MT2 >
284 typedef typename MT2::ConstIterator ConstIterator;
286 for(
size_t j=0UL; j<(~rhs).
columns(); ++j )
287 for( ConstIterator element=(~rhs).begin(j); element!=(~rhs).end(j); ++element )
288 dm_(j,element->index()) = element->value();
303 template<
typename MT2 >
311 const size_t m(
rows() );
315 const size_t end( n &
size_t(-2) );
317 for(
size_t i=0UL; i<m; ++i ) {
318 for(
size_t j=0UL; j<end; j+=2UL ) {
319 dm_(j ,i) += (~rhs)(i,j );
320 dm_(j+1UL,i) += (~rhs)(i,j+1UL);
324 dm_(end,i) += (~rhs)(i,end);
341 template<
typename MT2 >
349 const size_t m(
rows() );
351 const size_t block( 16UL );
353 for(
size_t ii=0UL; ii<m; ii+=block ) {
354 const size_t iend( ( m < ii+block )?( m ):( ii+block ) );
355 for(
size_t jj=0UL; jj<n; jj+=block ) {
356 const size_t jend( ( n < jj+block )?( n ):( jj+block ) );
357 for(
size_t i=ii; i<iend; ++i ) {
358 for(
size_t j=jj; j<jend; ++j ) {
359 dm_(j,i) += (~rhs)(i,j);
378 template<
typename MT2 >
386 typedef typename MT2::ConstIterator ConstIterator;
388 for(
size_t i=0UL; i<(~rhs).
rows(); ++i )
389 for( ConstIterator element=(~rhs).begin(i); element!=(~rhs).end(i); ++element )
390 dm_(element->index(),i) += element->value();
405 template<
typename MT2 >
413 typedef typename MT2::ConstIterator ConstIterator;
415 for(
size_t j=0UL; j<(~rhs).
columns(); ++j )
416 for( ConstIterator element=(~rhs).begin(j); element!=(~rhs).end(j); ++element )
417 dm_(j,element->index()) += element->value();
432 template<
typename MT2 >
440 const size_t m(
rows() );
444 const size_t end( n &
size_t(-2) );
446 for(
size_t i=0UL; i<m; ++i ) {
447 for(
size_t j=0UL; j<end; j+=2UL ) {
448 dm_(j ,i) -= (~rhs)(i,j );
449 dm_(j+1UL,i) -= (~rhs)(i,j+1UL);
453 dm_(end,i) -= (~rhs)(i,end);
470 template<
typename MT2 >
478 const size_t m(
rows() );
480 const size_t block( 16UL );
482 for(
size_t ii=0UL; ii<m; ii+=block ) {
483 const size_t iend( ( m < ii+block )?( m ):( ii+block ) );
484 for(
size_t jj=0UL; jj<n; jj+=block ) {
485 const size_t jend( ( n < jj+block )?( n ):( jj+block ) );
486 for(
size_t i=ii; i<iend; ++i ) {
487 for(
size_t j=jj; j<jend; ++j ) {
488 dm_(j,i) -= (~rhs)(i,j);
507 template<
typename MT2 >
515 typedef typename MT2::ConstIterator ConstIterator;
517 for(
size_t i=0UL; i<(~rhs).
rows(); ++i )
518 for( ConstIterator element=(~rhs).begin(i); element!=(~rhs).end(i); ++element )
519 dm_(element->index(),i) -= element->value();
534 template<
typename MT2 >
542 typedef typename MT2::ConstIterator ConstIterator;
544 for(
size_t j=0UL; j<(~rhs).
columns(); ++j )
545 for( ConstIterator element=(~rhs).begin(j); element!=(~rhs).end(j); ++element )
546 dm_(j,element->index()) -= element->value();
582 template<
typename MT >
588 typedef typename MT::TransposeType
ResultType;
594 typedef typename MT::Reference
Reference;
603 enum { vectorizable = MT::vectorizable };
645 inline size_t rows()
const {
646 return dm_.columns();
655 inline size_t columns()
const {
665 inline size_t spacing()
const {
666 return dm_.spacing();
675 inline void reset() {
686 template<
typename Other >
687 inline bool isAliased(
const Other* alias )
const
689 return dm_.isAliased( alias );
704 template<
typename MT2 >
705 inline void assign(
const DenseMatrix<MT2,true>& rhs )
712 const size_t m(
rows() );
716 const size_t end( m &
size_t(-2) );
718 for(
size_t j=0UL; j<n; ++j ) {
719 for(
size_t i=0UL; i<end; i+=2UL ) {
720 dm_(j,i ) = (~rhs)(i ,j);
721 dm_(j,i+1UL) = (~rhs)(i+1UL,j);
724 dm_(j,end) = (~rhs)(end,j);
741 template<
typename MT2 >
742 inline void assign(
const DenseMatrix<MT2,false>& rhs )
749 const size_t m(
rows() );
751 const size_t block( 16UL );
753 for(
size_t jj=0UL; jj<n; jj+=block ) {
754 const size_t jend( ( n < jj+block )?( n ):( jj+block ) );
755 for(
size_t ii=0UL; ii<m; ii+=block ) {
756 const size_t iend( ( m < ii+block )?( m ):( ii+block ) );
757 for(
size_t j=jj; j<jend; ++j ) {
758 for(
size_t i=ii; i<iend; ++i ) {
759 dm_(j,i) = (~rhs)(i,j);
778 template<
typename MT2 >
786 typedef typename MT2::ConstIterator ConstIterator;
788 for(
size_t j=0UL; j<(~rhs).
columns(); ++j )
789 for( ConstIterator element=(~rhs).begin(j); element!=(~rhs).end(j); ++element )
790 dm_(j,element->index()) = element->value();
805 template<
typename MT2 >
813 typedef typename MT2::ConstIterator ConstIterator;
815 for(
size_t i=0UL; i<(~rhs).
rows(); ++i )
816 for( ConstIterator element=(~rhs).begin(i); element!=(~rhs).end(i); ++element )
817 dm_(element->index(),i) = element->value();
832 template<
typename MT2 >
833 inline void addAssign(
const DenseMatrix<MT2,true>& rhs )
840 const size_t m(
rows() );
844 const size_t end( m &
size_t(-2) );
846 for(
size_t j=0UL; j<n; ++j ) {
847 for(
size_t i=0UL; i<end; i+=2UL ) {
848 dm_(j,i ) += (~rhs)(i ,j);
849 dm_(j,i+1UL) += (~rhs)(i+1UL,j);
852 dm_(j,end) += (~rhs)(end,j);
869 template<
typename MT2 >
870 inline void addAssign(
const DenseMatrix<MT2,false>& rhs )
877 const size_t m(
rows() );
879 const size_t block( 16UL );
881 for(
size_t jj=0UL; jj<n; jj+=block ) {
882 const size_t jend( ( n < jj+block )?( n ):( jj+block ) );
883 for(
size_t ii=0UL; ii<m; ii+=block ) {
884 const size_t iend( ( m < ii+block )?( m ):( ii+block ) );
885 for(
size_t j=jj; j<jend; ++j ) {
886 for(
size_t i=ii; i<iend; ++i ) {
887 dm_(j,i) += (~rhs)(i,j);
906 template<
typename MT2 >
914 typedef typename MT2::ConstIterator ConstIterator;
916 for(
size_t j=0UL; j<(~rhs).
columns(); ++j )
917 for( ConstIterator element=(~rhs).begin(j); element!=(~rhs).end(j); ++element )
918 dm_(j,element->index()) += element->value();
933 template<
typename MT2 >
941 typedef typename MT2::ConstIterator ConstIterator;
943 for(
size_t i=0UL; i<(~rhs).
rows(); ++i )
944 for( ConstIterator element=(~rhs).begin(i); element!=(~rhs).end(i); ++element )
945 dm_(element->index(),i) += element->value();
960 template<
typename MT2 >
961 inline void subAssign(
const DenseMatrix<MT2,true>& rhs )
968 const size_t m(
rows() );
972 const size_t end( m &
size_t(-2) );
974 for(
size_t j=0UL; j<n; ++j ) {
975 for(
size_t i=0UL; i<end; i+=2UL ) {
976 dm_(j,i ) -= (~rhs)(i ,j);
977 dm_(j,i+1UL) -= (~rhs)(i+1UL,j);
980 dm_(j,end) -= (~rhs)(end,j);
997 template<
typename MT2 >
998 inline void subAssign(
const DenseMatrix<MT2,false>& rhs )
1005 const size_t m(
rows() );
1007 const size_t block( 16UL );
1009 for(
size_t jj=0UL; jj<n; jj+=block ) {
1010 const size_t jend( ( n < jj+block )?( n ):( jj+block ) );
1011 for(
size_t ii=0UL; ii<m; ii+=block ) {
1012 const size_t iend( ( m < ii+block )?( m ):( ii+block ) );
1013 for(
size_t j=jj; j<jend; ++j ) {
1014 for(
size_t i=ii; i<iend; ++i ) {
1015 dm_(j,i) -= (~rhs)(i,j);
1034 template<
typename MT2 >
1042 typedef typename MT2::ConstIterator ConstIterator;
1044 for(
size_t j=0UL; j<(~rhs).
columns(); ++j )
1045 for( ConstIterator element=(~rhs).begin(j); element!=(~rhs).end(j); ++element )
1046 dm_(j,element->index()) -= element->value();
1061 template<
typename MT2 >
1069 typedef typename MT2::ConstIterator ConstIterator;
1071 for(
size_t i=0UL; i<(~rhs).
rows(); ++i )
1072 for( ConstIterator element=(~rhs).begin(i); element!=(~rhs).end(i); ++element )
1073 dm_(element->index(),i) -= element->value();
1118 template<
typename MT
1120 inline void reset( DMatTransposer<MT,SO>& m )