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_.canAlias( alias );
170 template<
typename Other >
173 return dm_.isAliased( alias );
188 template<
typename MT2 >
196 const size_t m(
rows() );
200 const size_t end( n &
size_t(-2) );
202 for(
size_t i=0UL; i<m; ++i ) {
203 for(
size_t j=0UL; j<end; j+=2UL ) {
204 dm_(j ,i) = (~rhs)(i,j );
205 dm_(j+1UL,i) = (~rhs)(i,j+1UL);
208 dm_(end,i) = (~rhs)(i,end);
225 template<
typename MT2 >
233 const size_t m(
rows() );
235 const size_t block( 16UL );
237 for(
size_t ii=0UL; ii<m; ii+=block ) {
238 const size_t iend( ( m < ii+block )?( m ):( ii+block ) );
239 for(
size_t jj=0UL; jj<n; jj+=block ) {
240 const size_t jend( ( n < jj+block )?( n ):( jj+block ) );
241 for(
size_t i=ii; i<iend; ++i ) {
242 for(
size_t j=jj; j<jend; ++j ) {
243 dm_(j,i) = (~rhs)(i,j);
262 template<
typename MT2 >
270 typedef typename MT2::ConstIterator ConstIterator;
272 for(
size_t i=0UL; i<(~rhs).
rows(); ++i )
273 for( ConstIterator element=(~rhs).begin(i); element!=(~rhs).end(i); ++element )
274 dm_(element->index(),i) = element->value();
289 template<
typename MT2 >
297 typedef typename MT2::ConstIterator ConstIterator;
299 for(
size_t j=0UL; j<(~rhs).
columns(); ++j )
300 for( ConstIterator element=(~rhs).begin(j); element!=(~rhs).end(j); ++element )
301 dm_(j,element->index()) = element->value();
316 template<
typename MT2 >
324 const size_t m(
rows() );
328 const size_t end( n &
size_t(-2) );
330 for(
size_t i=0UL; i<m; ++i ) {
331 for(
size_t j=0UL; j<end; j+=2UL ) {
332 dm_(j ,i) += (~rhs)(i,j );
333 dm_(j+1UL,i) += (~rhs)(i,j+1UL);
337 dm_(end,i) += (~rhs)(i,end);
354 template<
typename MT2 >
362 const size_t m(
rows() );
364 const size_t block( 16UL );
366 for(
size_t ii=0UL; ii<m; ii+=block ) {
367 const size_t iend( ( m < ii+block )?( m ):( ii+block ) );
368 for(
size_t jj=0UL; jj<n; jj+=block ) {
369 const size_t jend( ( n < jj+block )?( n ):( jj+block ) );
370 for(
size_t i=ii; i<iend; ++i ) {
371 for(
size_t j=jj; j<jend; ++j ) {
372 dm_(j,i) += (~rhs)(i,j);
391 template<
typename MT2 >
399 typedef typename MT2::ConstIterator ConstIterator;
401 for(
size_t i=0UL; i<(~rhs).
rows(); ++i )
402 for( ConstIterator element=(~rhs).begin(i); element!=(~rhs).end(i); ++element )
403 dm_(element->index(),i) += element->value();
418 template<
typename MT2 >
426 typedef typename MT2::ConstIterator ConstIterator;
428 for(
size_t j=0UL; j<(~rhs).
columns(); ++j )
429 for( ConstIterator element=(~rhs).begin(j); element!=(~rhs).end(j); ++element )
430 dm_(j,element->index()) += element->value();
445 template<
typename MT2 >
453 const size_t m(
rows() );
457 const size_t end( n &
size_t(-2) );
459 for(
size_t i=0UL; i<m; ++i ) {
460 for(
size_t j=0UL; j<end; j+=2UL ) {
461 dm_(j ,i) -= (~rhs)(i,j );
462 dm_(j+1UL,i) -= (~rhs)(i,j+1UL);
466 dm_(end,i) -= (~rhs)(i,end);
483 template<
typename MT2 >
491 const size_t m(
rows() );
493 const size_t block( 16UL );
495 for(
size_t ii=0UL; ii<m; ii+=block ) {
496 const size_t iend( ( m < ii+block )?( m ):( ii+block ) );
497 for(
size_t jj=0UL; jj<n; jj+=block ) {
498 const size_t jend( ( n < jj+block )?( n ):( jj+block ) );
499 for(
size_t i=ii; i<iend; ++i ) {
500 for(
size_t j=jj; j<jend; ++j ) {
501 dm_(j,i) -= (~rhs)(i,j);
520 template<
typename MT2 >
528 typedef typename MT2::ConstIterator ConstIterator;
530 for(
size_t i=0UL; i<(~rhs).
rows(); ++i )
531 for( ConstIterator element=(~rhs).begin(i); element!=(~rhs).end(i); ++element )
532 dm_(element->index(),i) -= element->value();
547 template<
typename MT2 >
555 typedef typename MT2::ConstIterator ConstIterator;
557 for(
size_t j=0UL; j<(~rhs).
columns(); ++j )
558 for( ConstIterator element=(~rhs).begin(j); element!=(~rhs).end(j); ++element )
559 dm_(j,element->index()) -= element->value();
595 template<
typename MT >
601 typedef typename MT::TransposeType
ResultType;
607 typedef typename MT::Reference
Reference;
616 enum { vectorizable = MT::vectorizable };
658 inline size_t rows()
const {
659 return dm_.columns();
668 inline size_t columns()
const {
678 inline size_t spacing()
const {
679 return dm_.spacing();
688 inline void reset() {
699 template<
typename Other >
700 inline bool isAliased(
const Other* alias )
const
702 return dm_.isAliased( alias );
717 template<
typename MT2 >
718 inline void assign(
const DenseMatrix<MT2,true>& rhs )
725 const size_t m(
rows() );
729 const size_t end( m &
size_t(-2) );
731 for(
size_t j=0UL; j<n; ++j ) {
732 for(
size_t i=0UL; i<end; i+=2UL ) {
733 dm_(j,i ) = (~rhs)(i ,j);
734 dm_(j,i+1UL) = (~rhs)(i+1UL,j);
737 dm_(j,end) = (~rhs)(end,j);
754 template<
typename MT2 >
755 inline void assign(
const DenseMatrix<MT2,false>& rhs )
762 const size_t m(
rows() );
764 const size_t block( 16UL );
766 for(
size_t jj=0UL; jj<n; jj+=block ) {
767 const size_t jend( ( n < jj+block )?( n ):( jj+block ) );
768 for(
size_t ii=0UL; ii<m; ii+=block ) {
769 const size_t iend( ( m < ii+block )?( m ):( ii+block ) );
770 for(
size_t j=jj; j<jend; ++j ) {
771 for(
size_t i=ii; i<iend; ++i ) {
772 dm_(j,i) = (~rhs)(i,j);
791 template<
typename MT2 >
792 inline void assign(
const SparseMatrix<MT2,true>& rhs )
799 typedef typename MT2::ConstIterator ConstIterator;
801 for(
size_t j=0UL; j<(~rhs).
columns(); ++j )
802 for( ConstIterator element=(~rhs).begin(j); element!=(~rhs).end(j); ++element )
803 dm_(j,element->index()) = element->value();
818 template<
typename MT2 >
819 inline void assign(
const SparseMatrix<MT2,false>& rhs )
826 typedef typename MT2::ConstIterator ConstIterator;
828 for(
size_t i=0UL; i<(~rhs).
rows(); ++i )
829 for( ConstIterator element=(~rhs).begin(i); element!=(~rhs).end(i); ++element )
830 dm_(element->index(),i) = element->value();
845 template<
typename MT2 >
846 inline void addAssign(
const DenseMatrix<MT2,true>& rhs )
853 const size_t m(
rows() );
857 const size_t end( m &
size_t(-2) );
859 for(
size_t j=0UL; j<n; ++j ) {
860 for(
size_t i=0UL; i<end; i+=2UL ) {
861 dm_(j,i ) += (~rhs)(i ,j);
862 dm_(j,i+1UL) += (~rhs)(i+1UL,j);
865 dm_(j,end) += (~rhs)(end,j);
882 template<
typename MT2 >
883 inline void addAssign(
const DenseMatrix<MT2,false>& rhs )
890 const size_t m(
rows() );
892 const size_t block( 16UL );
894 for(
size_t jj=0UL; jj<n; jj+=block ) {
895 const size_t jend( ( n < jj+block )?( n ):( jj+block ) );
896 for(
size_t ii=0UL; ii<m; ii+=block ) {
897 const size_t iend( ( m < ii+block )?( m ):( ii+block ) );
898 for(
size_t j=jj; j<jend; ++j ) {
899 for(
size_t i=ii; i<iend; ++i ) {
900 dm_(j,i) += (~rhs)(i,j);
919 template<
typename MT2 >
920 inline void addAssign(
const SparseMatrix<MT2,true>& rhs )
927 typedef typename MT2::ConstIterator ConstIterator;
929 for(
size_t j=0UL; j<(~rhs).
columns(); ++j )
930 for( ConstIterator element=(~rhs).begin(j); element!=(~rhs).end(j); ++element )
931 dm_(j,element->index()) += element->value();
946 template<
typename MT2 >
947 inline void addAssign(
const SparseMatrix<MT2,false>& rhs )
954 typedef typename MT2::ConstIterator ConstIterator;
956 for(
size_t i=0UL; i<(~rhs).
rows(); ++i )
957 for( ConstIterator element=(~rhs).begin(i); element!=(~rhs).end(i); ++element )
958 dm_(element->index(),i) += element->value();
973 template<
typename MT2 >
974 inline void subAssign(
const DenseMatrix<MT2,true>& rhs )
981 const size_t m(
rows() );
985 const size_t end( m &
size_t(-2) );
987 for(
size_t j=0UL; j<n; ++j ) {
988 for(
size_t i=0UL; i<end; i+=2UL ) {
989 dm_(j,i ) -= (~rhs)(i ,j);
990 dm_(j,i+1UL) -= (~rhs)(i+1UL,j);
993 dm_(j,end) -= (~rhs)(end,j);
1010 template<
typename MT2 >
1011 inline void subAssign(
const DenseMatrix<MT2,false>& rhs )
1018 const size_t m(
rows() );
1020 const size_t block( 16UL );
1022 for(
size_t jj=0UL; jj<n; jj+=block ) {
1023 const size_t jend( ( n < jj+block )?( n ):( jj+block ) );
1024 for(
size_t ii=0UL; ii<m; ii+=block ) {
1025 const size_t iend( ( m < ii+block )?( m ):( ii+block ) );
1026 for(
size_t j=jj; j<jend; ++j ) {
1027 for(
size_t i=ii; i<iend; ++i ) {
1028 dm_(j,i) -= (~rhs)(i,j);
1047 template<
typename MT2 >
1048 inline void subAssign(
const SparseMatrix<MT2,true>& rhs )
1055 typedef typename MT2::ConstIterator ConstIterator;
1057 for(
size_t j=0UL; j<(~rhs).
columns(); ++j )
1058 for( ConstIterator element=(~rhs).begin(j); element!=(~rhs).end(j); ++element )
1059 dm_(j,element->index()) -= element->value();
1074 template<
typename MT2 >
1075 inline void subAssign(
const SparseMatrix<MT2,false>& rhs )
1082 typedef typename MT2::ConstIterator ConstIterator;
1084 for(
size_t i=0UL; i<(~rhs).
rows(); ++i )
1085 for( ConstIterator element=(~rhs).begin(i); element!=(~rhs).end(i); ++element )
1086 dm_(element->index(),i) -= element->value();
1131 template<
typename MT
1133 inline void reset( DMatTransposer<MT,SO>& m )