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: //! \addtogroup subview_field Chris@49: //! @{ Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: subview_field::~subview_field() Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: subview_field::subview_field Chris@49: ( Chris@49: const field& in_f, Chris@49: const uword in_row1, Chris@49: const uword in_col1, Chris@49: const uword in_n_rows, Chris@49: const uword in_n_cols Chris@49: ) Chris@49: : f(in_f) Chris@49: , aux_row1(in_row1) Chris@49: , aux_col1(in_col1) Chris@49: , n_rows(in_n_rows) Chris@49: , n_cols(in_n_cols) Chris@49: , n_elem(in_n_rows*in_n_cols) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_field::operator= (const field& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: subview_field& t = *this; Chris@49: Chris@49: arma_debug_check( (t.n_rows != x.n_rows) || (t.n_cols != x.n_cols), "incompatible field dimensions"); Chris@49: Chris@49: for(uword col=0; col Chris@49: inline Chris@49: void Chris@49: subview_field::operator= (const subview_field& x_in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const bool overlap = check_overlap(x_in); Chris@49: Chris@49: field* tmp_field = overlap ? new field(x_in.f) : 0; Chris@49: const subview_field* tmp_subview = overlap ? new subview_field(*tmp_field, x_in.aux_row1, x_in.aux_col1, x_in.n_rows, x_in.n_cols) : 0; Chris@49: const subview_field& x = overlap ? (*tmp_subview) : x_in; Chris@49: Chris@49: subview_field& t = *this; Chris@49: Chris@49: arma_debug_check( (t.n_rows != x.n_rows) || (t.n_cols != x.n_cols), "incompatible field dimensions"); Chris@49: Chris@49: for(uword col=0; col Chris@49: arma_inline Chris@49: oT& Chris@49: subview_field::operator[](const uword i) Chris@49: { Chris@49: const uword in_col = i / n_rows; Chris@49: const uword in_row = i % n_rows; Chris@49: Chris@49: const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row; Chris@49: Chris@49: return *((const_cast< field& >(f)).mem[index]); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const oT& Chris@49: subview_field::operator[](const uword i) const Chris@49: { Chris@49: const uword in_col = i / n_rows; Chris@49: const uword in_row = i % n_rows; Chris@49: Chris@49: const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row; Chris@49: Chris@49: return *(f.mem[index]); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: oT& Chris@49: subview_field::operator()(const uword i) Chris@49: { Chris@49: arma_debug_check( (i >= n_elem), "subview_field::operator(): index out of bounds"); Chris@49: Chris@49: const uword in_col = i / n_rows; Chris@49: const uword in_row = i % n_rows; Chris@49: Chris@49: const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row; Chris@49: Chris@49: return *((const_cast< field& >(f)).mem[index]); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const oT& Chris@49: subview_field::operator()(const uword i) const Chris@49: { Chris@49: arma_debug_check( (i >= n_elem), "subview_field::operator(): index out of bounds"); Chris@49: Chris@49: const uword in_col = i / n_rows; Chris@49: const uword in_row = i % n_rows; Chris@49: Chris@49: const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row; Chris@49: Chris@49: return *(f.mem[index]); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: oT& Chris@49: subview_field::operator()(const uword in_row, const uword in_col) Chris@49: { Chris@49: arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), "subview_field::operator(): index out of bounds"); Chris@49: Chris@49: const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row; Chris@49: Chris@49: return *((const_cast< field& >(f)).mem[index]); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const oT& Chris@49: subview_field::operator()(const uword in_row, const uword in_col) const Chris@49: { Chris@49: arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), "subview_field::operator(): index out of bounds"); Chris@49: Chris@49: const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row; Chris@49: Chris@49: return *(f.mem[index]); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: oT& Chris@49: subview_field::at(const uword in_row, const uword in_col) Chris@49: { Chris@49: const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row; Chris@49: Chris@49: return *((const_cast< field& >(f)).mem[index]); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const oT& Chris@49: subview_field::at(const uword in_row, const uword in_col) const Chris@49: { Chris@49: //arma_extra_debug_sigprint(); Chris@49: Chris@49: const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row; Chris@49: Chris@49: return *(f.mem[index]); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: bool Chris@49: subview_field::check_overlap(const subview_field& x) const Chris@49: { Chris@49: const subview_field& t = *this; Chris@49: Chris@49: if(&t.f != &x.f) Chris@49: { Chris@49: return false; Chris@49: } Chris@49: else Chris@49: { Chris@49: if( (t.n_elem == 0) || (x.n_elem == 0) ) Chris@49: { Chris@49: return false; Chris@49: } Chris@49: else Chris@49: { Chris@49: const uword t_row_start = t.aux_row1; Chris@49: const uword t_row_end_p1 = t_row_start + t.n_rows; Chris@49: Chris@49: const uword t_col_start = t.aux_col1; Chris@49: const uword t_col_end_p1 = t_col_start + t.n_cols; Chris@49: Chris@49: Chris@49: const uword x_row_start = x.aux_row1; Chris@49: const uword x_row_end_p1 = x_row_start + x.n_rows; Chris@49: Chris@49: const uword x_col_start = x.aux_col1; Chris@49: const uword x_col_end_p1 = x_col_start + x.n_cols; Chris@49: Chris@49: Chris@49: const bool outside_rows = ( (x_row_start >= t_row_end_p1) || (t_row_start >= x_row_end_p1) ); Chris@49: const bool outside_cols = ( (x_col_start >= t_col_end_p1) || (t_col_start >= x_col_end_p1) ); Chris@49: Chris@49: return ( (outside_rows == false) && (outside_cols == false) ); Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! X = Y.subfield(...) Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_field::extract(field& actual_out, const subview_field& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: // Chris@49: const bool alias = (&actual_out == &in.f); Chris@49: Chris@49: field* tmp = (alias) ? new field : 0; Chris@49: field& out = (alias) ? (*tmp) : actual_out; Chris@49: Chris@49: // Chris@49: Chris@49: const uword n_rows = in.n_rows; Chris@49: const uword n_cols = in.n_cols; Chris@49: Chris@49: out.set_size(n_rows, n_cols); Chris@49: Chris@49: arma_extra_debug_print(arma_boost::format("out.n_rows = %d out.n_cols = %d in.m.n_rows = %d in.m.n_cols = %d") % out.n_rows % out.n_cols % in.f.n_rows % in.f.n_cols ); Chris@49: Chris@49: for(uword col = 0; col