inline void subview_cube<eT>::div_inplace(Mat<eT>& out, const subview_cube<eT>& in) { arma_extra_debug_sigprint(); arma_debug_assert_cube_as_mat(out, in, "element-wise division", true); const uword in_n_rows = in.n_rows; const uword in_n_cols = in.n_cols; const uword in_n_slices = in.n_slices; const uword out_n_rows = out.n_rows; const uword out_n_cols = out.n_cols; const uword out_vec_state = out.vec_state; if(in_n_slices == 1) { for(uword col=0; col < in_n_cols; ++col) { arrayops::inplace_div( out.colptr(col), in.slice_colptr(0, col), in_n_rows ); } } else { if(out_vec_state == 0) { if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) ) { for(uword i=0; i < in_n_slices; ++i) { arrayops::inplace_div( out.colptr(i), in.slice_colptr(i, 0), in_n_rows ); } } else if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) ) { const Cube<eT>& Q = in.m; const uword in_aux_row1 = in.aux_row1; const uword in_aux_col1 = in.aux_col1; const uword in_aux_slice1 = in.aux_slice1; for(uword slice=0; slice < in_n_slices; ++slice) { const uword mod_slice = in_aux_slice1 + slice; eT* out_colptr = out.colptr(slice); uword i,j; for(i=0, j=1; j < in_n_cols; i+=2, j+=2) { const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice); const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice); out_colptr[i] /= tmp_i; out_colptr[j] /= tmp_j; } if(i < in_n_cols) { out_colptr[i] /= Q.at(in_aux_row1, in_aux_col1 + i, mod_slice); } } } } else { eT* out_mem = out.memptr(); const Cube<eT>& Q = in.m; const uword in_aux_row1 = in.aux_row1; const uword in_aux_col1 = in.aux_col1; const uword in_aux_slice1 = in.aux_slice1; for(uword i=0; i<in_n_slices; ++i) { out_mem[i] /= Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i); } } } }
inline void subview_cube<eT>::div_inplace(Mat<eT>& out, const subview_cube<eT>& in) { arma_extra_debug_sigprint(); arma_debug_assert_cube_as_mat(out, in, "element-wise division", true); const u32 in_n_rows = in.n_rows; const u32 in_n_cols = in.n_cols; const u32 in_n_slices = in.n_slices; const u32 out_n_rows = out.n_rows; const u32 out_n_cols = out.n_cols; const u32 out_vec_state = out.vec_state; if(in_n_slices == 1) { for(u32 col=0; col < in_n_cols; ++col) { arrayops::inplace_div( out.colptr(col), in.slice_colptr(0, col), in_n_rows ); } } else { if(out_vec_state == 0) { if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) ) { for(u32 i=0; i < in_n_slices; ++i) { arrayops::inplace_div( out.colptr(i), in.slice_colptr(i, 0), in_n_rows ); } } else if( (in_n_rows == 1) && (in_n_cols == out_n_cols) && (in_n_slices == out_n_rows) ) { const Cube<eT>& Q = in.m; const u32 in_aux_row1 = in.aux_row1; const u32 in_aux_col1 = in.aux_col1; const u32 in_aux_slice1 = in.aux_slice1; for(u32 col=0; col < in_n_cols; ++col) { eT* out_colptr = out.colptr(col); for(u32 i=0; i < in_n_slices; ++i) { out_colptr[i] /= Q.at(in_aux_row1, in_aux_col1 + col, in_aux_slice1 + i); } } } } else { eT* out_mem = out.memptr(); const Cube<eT>& Q = in.m; const u32 in_aux_row1 = in.aux_row1; const u32 in_aux_col1 = in.aux_col1; const u32 in_aux_slice1 = in.aux_slice1; for(u32 i=0; i<in_n_slices; ++i) { out_mem[i] /= Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i); } } } }
inline void subview_cube<eT>::extract(Mat<eT>& out, const subview_cube<eT>& in) { arma_extra_debug_sigprint(); arma_debug_assert_cube_as_mat(out, in, "copy into matrix", false); const uword in_n_rows = in.n_rows; const uword in_n_cols = in.n_cols; const uword in_n_slices = in.n_slices; const uword out_vec_state = out.vec_state; if(in_n_slices == 1) { out.set_size(in_n_rows, in_n_cols); for(uword col=0; col < in_n_cols; ++col) { arrayops::copy( out.colptr(col), in.slice_colptr(0, col), in_n_rows ); } } else { if(out_vec_state == 0) { if(in_n_cols == 1) { out.set_size(in_n_rows, in_n_slices); for(uword i=0; i < in_n_slices; ++i) { arrayops::copy( out.colptr(i), in.slice_colptr(i, 0), in_n_rows ); } } else if(in_n_rows == 1) { const Cube<eT>& Q = in.m; const uword in_aux_row1 = in.aux_row1; const uword in_aux_col1 = in.aux_col1; const uword in_aux_slice1 = in.aux_slice1; out.set_size(in_n_cols, in_n_slices); for(uword slice=0; slice < in_n_slices; ++slice) { const uword mod_slice = in_aux_slice1 + slice; eT* out_colptr = out.colptr(slice); uword i,j; for(i=0, j=1; j < in_n_cols; i+=2, j+=2) { const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice); const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice); out_colptr[i] = tmp_i; out_colptr[j] = tmp_j; } if(i < in_n_cols) { out_colptr[i] = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice); } } } } else { out.set_size(in_n_slices); eT* out_mem = out.memptr(); const Cube<eT>& Q = in.m; const uword in_aux_row1 = in.aux_row1; const uword in_aux_col1 = in.aux_col1; const uword in_aux_slice1 = in.aux_slice1; for(uword i=0; i<in_n_slices; ++i) { out_mem[i] = Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i); } } } }
inline void subview_cube<eT>::extract(Mat<eT>& out, const subview_cube<eT>& in) { arma_extra_debug_sigprint(); arma_debug_assert_cube_as_mat(out, in, "copy into matrix", false); const u32 in_n_rows = in.n_rows; const u32 in_n_cols = in.n_cols; const u32 in_n_slices = in.n_slices; const u32 out_vec_state = out.vec_state; if(in_n_slices == 1) { out.set_size(in_n_rows, in_n_cols); for(u32 col=0; col < in_n_cols; ++col) { arrayops::copy( out.colptr(col), in.slice_colptr(0, col), in_n_rows ); } } else { if(out_vec_state == 0) { if(in_n_cols == 1) { out.set_size(in_n_rows, in_n_slices); for(u32 i=0; i < in_n_slices; ++i) { arrayops::copy( out.colptr(i), in.slice_colptr(i, 0), in_n_rows ); } } else if(in_n_rows == 1) { out.set_size(in_n_slices, in_n_cols); const Cube<eT>& Q = in.m; const u32 in_aux_row1 = in.aux_row1; const u32 in_aux_col1 = in.aux_col1; const u32 in_aux_slice1 = in.aux_slice1; for(u32 col=0; col < in_n_cols; ++col) { eT* out_colptr = out.colptr(col); for(u32 i=0; i < in_n_slices; ++i) { out_colptr[i] = Q.at(in_aux_row1, in_aux_col1 + col, in_aux_slice1 + i); } } } } else { out.set_size(in_n_slices); eT* out_mem = out.memptr(); const Cube<eT>& Q = in.m; const u32 in_aux_row1 = in.aux_row1; const u32 in_aux_col1 = in.aux_col1; const u32 in_aux_slice1 = in.aux_slice1; for(u32 i=0; i<in_n_slices; ++i) { out_mem[i] = Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i); } } } }