Chris@49: // Copyright (C) 2008-2012 NICTA (www.nicta.com.au) Chris@49: // Copyright (C) 2008-2012 Conrad Sanderson Chris@49: // Chris@49: // This Source Code Form is subject to the terms of the Mozilla Public Chris@49: // License, v. 2.0. If a copy of the MPL was not distributed with this Chris@49: // file, You can obtain one at http://mozilla.org/MPL/2.0/. Chris@49: Chris@49: Chris@49: Chris@49: //! \addtogroup op_reshape Chris@49: //! @{ Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: op_reshape::apply(Mat& out, const Op& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename T1::elem_type eT; Chris@49: Chris@49: const unwrap A_tmp(in.m); Chris@49: const Mat& A = A_tmp.M; Chris@49: Chris@49: const bool is_alias = (&out == &A); Chris@49: Chris@49: const uword in_n_rows = in.aux_uword_a; Chris@49: const uword in_n_cols = in.aux_uword_b; Chris@49: const uword in_dim = in.aux_uword_c; Chris@49: Chris@49: const uword in_n_elem = in_n_rows * in_n_cols; Chris@49: Chris@49: if(A.n_elem == in_n_elem) Chris@49: { Chris@49: if(in_dim == 0) Chris@49: { Chris@49: if(is_alias == false) Chris@49: { Chris@49: out.set_size(in_n_rows, in_n_cols); Chris@49: arrayops::copy( out.memptr(), A.memptr(), out.n_elem ); Chris@49: } Chris@49: else // &out == &A, i.e. inplace resize Chris@49: { Chris@49: const bool same_size = ( (out.n_rows == in_n_rows) && (out.n_cols == in_n_cols) ); Chris@49: Chris@49: if(same_size == false) Chris@49: { Chris@49: arma_debug_check Chris@49: ( Chris@49: (out.mem_state == 3), Chris@49: "reshape(): size can't be changed as template based size specification is in use" Chris@49: ); Chris@49: Chris@49: access::rw(out.n_rows) = in_n_rows; Chris@49: access::rw(out.n_cols) = in_n_cols; Chris@49: } Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: unwrap_check< Mat > B_tmp(A, is_alias); Chris@49: const Mat& B = B_tmp.M; Chris@49: Chris@49: out.set_size(in_n_rows, in_n_cols); Chris@49: Chris@49: eT* out_mem = out.memptr(); Chris@49: uword i = 0; Chris@49: Chris@49: const uword B_n_rows = B.n_rows; Chris@49: const uword B_n_cols = B.n_cols; Chris@49: Chris@49: for(uword row=0; row > B_tmp(A, is_alias); Chris@49: const Mat& B = B_tmp.M; Chris@49: Chris@49: const uword n_elem_to_copy = (std::min)(B.n_elem, in_n_elem); Chris@49: Chris@49: out.set_size(in_n_rows, in_n_cols); Chris@49: Chris@49: eT* out_mem = out.memptr(); Chris@49: Chris@49: if(in_dim == 0) Chris@49: { Chris@49: arrayops::copy( out_mem, B.memptr(), n_elem_to_copy ); Chris@49: } Chris@49: else Chris@49: { Chris@49: uword row = 0; Chris@49: uword col = 0; Chris@49: Chris@49: const uword B_n_cols = B.n_cols; Chris@49: Chris@49: for(uword i=0; i= B_n_cols) Chris@49: { Chris@49: col = 0; Chris@49: ++row; Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: for(uword i=n_elem_to_copy; i Chris@49: inline Chris@49: void Chris@49: op_reshape::apply(Cube& out, const OpCube& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename T1::elem_type eT; Chris@49: Chris@49: const unwrap_cube A_tmp(in.m); Chris@49: const Cube& A = A_tmp.M; Chris@49: Chris@49: const uword in_n_rows = in.aux_uword_a; Chris@49: const uword in_n_cols = in.aux_uword_b; Chris@49: const uword in_n_slices = in.aux_uword_c; Chris@49: const uword in_dim = in.aux_uword_d; Chris@49: Chris@49: const uword in_n_elem = in_n_rows * in_n_cols * in_n_slices; Chris@49: Chris@49: if(A.n_elem == in_n_elem) Chris@49: { Chris@49: if(in_dim == 0) Chris@49: { Chris@49: if(&out != &A) Chris@49: { Chris@49: out.set_size(in_n_rows, in_n_cols, in_n_slices); Chris@49: arrayops::copy( out.memptr(), A.memptr(), out.n_elem ); Chris@49: } Chris@49: else // &out == &A, i.e. inplace resize Chris@49: { Chris@49: const bool same_size = ( (out.n_rows == in_n_rows) && (out.n_cols == in_n_cols) && (out.n_slices == in_n_slices) ); Chris@49: Chris@49: if(same_size == false) Chris@49: { Chris@49: arma_debug_check Chris@49: ( Chris@49: (out.mem_state == 3), Chris@49: "reshape(): size can't be changed as template based size specification is in use" Chris@49: ); Chris@49: Chris@49: out.delete_mat(); Chris@49: Chris@49: access::rw(out.n_rows) = in_n_rows; Chris@49: access::rw(out.n_cols) = in_n_cols; Chris@49: access::rw(out.n_elem_slice) = in_n_rows * in_n_cols; Chris@49: access::rw(out.n_slices) = in_n_slices; Chris@49: Chris@49: out.create_mat(); Chris@49: } Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: unwrap_cube_check< Cube > B_tmp(A, out); Chris@49: const Cube& B = B_tmp.M; Chris@49: Chris@49: out.set_size(in_n_rows, in_n_cols, in_n_slices); Chris@49: Chris@49: eT* out_mem = out.memptr(); Chris@49: uword i = 0; Chris@49: Chris@49: const uword B_n_rows = B.n_rows; Chris@49: const uword B_n_cols = B.n_cols; Chris@49: const uword B_n_slices = B.n_slices; Chris@49: Chris@49: for(uword slice=0; slice > B_tmp(A, out); Chris@49: const Cube& B = B_tmp.M; Chris@49: Chris@49: const uword n_elem_to_copy = (std::min)(B.n_elem, in_n_elem); Chris@49: Chris@49: out.set_size(in_n_rows, in_n_cols, in_n_slices); Chris@49: Chris@49: eT* out_mem = out.memptr(); Chris@49: Chris@49: if(in_dim == 0) Chris@49: { Chris@49: arrayops::copy( out_mem, B.memptr(), n_elem_to_copy ); Chris@49: } Chris@49: else Chris@49: { Chris@49: uword row = 0; Chris@49: uword col = 0; Chris@49: uword slice = 0; Chris@49: Chris@49: const uword B_n_rows = B.n_rows; Chris@49: const uword B_n_cols = B.n_cols; Chris@49: Chris@49: for(uword i=0; i= B_n_cols) Chris@49: { Chris@49: col = 0; Chris@49: ++row; Chris@49: Chris@49: if(row >= B_n_rows) Chris@49: { Chris@49: row = 0; Chris@49: ++slice; Chris@49: } Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: for(uword i=n_elem_to_copy; i