arma_hot inline void op_strans::apply_noalias(Mat<eT>& out, const TA& A) { arma_extra_debug_sigprint(); const uword A_n_cols = A.n_cols; const uword A_n_rows = A.n_rows; out.set_size(A_n_cols, A_n_rows); if( (TA::is_row) || (TA::is_col) || (A_n_cols == 1) || (A_n_rows == 1) ) { arrayops::copy( out.memptr(), A.memptr(), A.n_elem ); } else { if( (A_n_rows <= 4) && (A_n_rows == A_n_cols) ) { op_strans::apply_noalias_tinysq(out, A); } else { for(uword k=0; k < A_n_cols; ++k) { uword i, j; const eT* colptr = A.colptr(k); for(i=0, j=1; j < A_n_rows; i+=2, j+=2) { const eT tmp_i = colptr[i]; const eT tmp_j = colptr[j]; out.at(k, i) = tmp_i; out.at(k, j) = tmp_j; } if(i < A_n_rows) { out.at(k, i) = colptr[i]; } } } } }
arma_hot inline void op_strans2::apply_noalias(Mat<eT>& out, const TA& A, const eT val) { arma_extra_debug_sigprint(); const uword A_n_cols = A.n_cols; const uword A_n_rows = A.n_rows; out.set_size(A_n_cols, A_n_rows); if( (TA::is_col) || (TA::is_row) || (A_n_cols == 1) || (A_n_rows == 1) ) { const uword N = A.n_elem; const eT* A_mem = A.memptr(); eT* out_mem = out.memptr(); uword i,j; for(i=0, j=1; j < N; i+=2, j+=2) { const eT tmp_i = A_mem[i]; const eT tmp_j = A_mem[j]; out_mem[i] = val * tmp_i; out_mem[j] = val * tmp_j; } if(i < N) { out_mem[i] = val * A_mem[i]; } } else { if( (A_n_rows <= 4) && (A_n_rows == A_n_cols) ) { op_strans2::apply_noalias_tinysq(out, A, val); } else { for(uword k=0; k < A_n_cols; ++k) { uword i, j; const eT* colptr = A.colptr(k); for(i=0, j=1; j < A_n_rows; i+=2, j+=2) { const eT tmp_i = colptr[i]; const eT tmp_j = colptr[j]; out.at(k, i) = val * tmp_i; out.at(k, j) = val * tmp_j; } if(i < A_n_rows) { out.at(k, i) = val * colptr[i]; } } } } }
arma_hot inline void op_strans2::apply_noalias_tinysq(Mat<eT>& out, const TA& A, const eT val) { const eT* Am = A.memptr(); eT* outm = out.memptr(); switch(A.n_rows) { case 1: { outm[0] = val * Am[0]; } break; case 2: { outm[pos<false,0,0>::n2] = val * Am[pos<true,0,0>::n2]; outm[pos<false,1,0>::n2] = val * Am[pos<true,1,0>::n2]; outm[pos<false,0,1>::n2] = val * Am[pos<true,0,1>::n2]; outm[pos<false,1,1>::n2] = val * Am[pos<true,1,1>::n2]; } break; case 3: { outm[pos<false,0,0>::n3] = val * Am[pos<true,0,0>::n3]; outm[pos<false,1,0>::n3] = val * Am[pos<true,1,0>::n3]; outm[pos<false,2,0>::n3] = val * Am[pos<true,2,0>::n3]; outm[pos<false,0,1>::n3] = val * Am[pos<true,0,1>::n3]; outm[pos<false,1,1>::n3] = val * Am[pos<true,1,1>::n3]; outm[pos<false,2,1>::n3] = val * Am[pos<true,2,1>::n3]; outm[pos<false,0,2>::n3] = val * Am[pos<true,0,2>::n3]; outm[pos<false,1,2>::n3] = val * Am[pos<true,1,2>::n3]; outm[pos<false,2,2>::n3] = val * Am[pos<true,2,2>::n3]; } break; case 4: { outm[pos<false,0,0>::n4] = val * Am[pos<true,0,0>::n4]; outm[pos<false,1,0>::n4] = val * Am[pos<true,1,0>::n4]; outm[pos<false,2,0>::n4] = val * Am[pos<true,2,0>::n4]; outm[pos<false,3,0>::n4] = val * Am[pos<true,3,0>::n4]; outm[pos<false,0,1>::n4] = val * Am[pos<true,0,1>::n4]; outm[pos<false,1,1>::n4] = val * Am[pos<true,1,1>::n4]; outm[pos<false,2,1>::n4] = val * Am[pos<true,2,1>::n4]; outm[pos<false,3,1>::n4] = val * Am[pos<true,3,1>::n4]; outm[pos<false,0,2>::n4] = val * Am[pos<true,0,2>::n4]; outm[pos<false,1,2>::n4] = val * Am[pos<true,1,2>::n4]; outm[pos<false,2,2>::n4] = val * Am[pos<true,2,2>::n4]; outm[pos<false,3,2>::n4] = val * Am[pos<true,3,2>::n4]; outm[pos<false,0,3>::n4] = val * Am[pos<true,0,3>::n4]; outm[pos<false,1,3>::n4] = val * Am[pos<true,1,3>::n4]; outm[pos<false,2,3>::n4] = val * Am[pos<true,2,3>::n4]; outm[pos<false,3,3>::n4] = val * Am[pos<true,3,3>::n4]; } break; default: ; } }