Chris@49: // Copyright (C) 2008-2013 NICTA (www.nicta.com.au) Chris@49: // Copyright (C) 2008-2013 Conrad Sanderson Chris@49: // Copyright (C) 2011 James Sanders 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 Chris@49: //! @{ Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: subview::~subview() Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: subview::subview(const Mat& in_m, const uword in_row1, const uword in_col1, const uword in_n_rows, const uword in_n_cols) Chris@49: : m(in_m) 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::operator+= (const eT val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const uword local_n_cols = n_cols; Chris@49: const uword local_n_rows = n_rows; Chris@49: Chris@49: if(local_n_rows == 1) Chris@49: { Chris@49: Mat& X = const_cast< Mat& >(m); Chris@49: Chris@49: const uword urow = aux_row1; Chris@49: const uword start_col = aux_col1; Chris@49: const uword end_col_plus1 = start_col + local_n_cols; Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=start_col, jj=start_col+1; jj < end_col_plus1; ii+=2, jj+=2) Chris@49: { Chris@49: X.at(urow, ii) += val; Chris@49: X.at(urow, jj) += val; Chris@49: } Chris@49: Chris@49: if(ii < end_col_plus1) Chris@49: { Chris@49: X.at(urow, ii) += val; Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword ucol=0; ucol < local_n_cols; ++ucol) Chris@49: { Chris@49: arrayops::inplace_plus( colptr(ucol), val, local_n_rows ); Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::operator-= (const eT val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const uword local_n_cols = n_cols; Chris@49: const uword local_n_rows = n_rows; Chris@49: Chris@49: if(local_n_rows == 1) Chris@49: { Chris@49: Mat& X = const_cast< Mat& >(m); Chris@49: Chris@49: const uword urow = aux_row1; Chris@49: const uword start_col = aux_col1; Chris@49: const uword end_col_plus1 = start_col + local_n_cols; Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=start_col, jj=start_col+1; jj < end_col_plus1; ii+=2, jj+=2) Chris@49: { Chris@49: X.at(urow, ii) -= val; Chris@49: X.at(urow, jj) -= val; Chris@49: } Chris@49: Chris@49: if(ii < end_col_plus1) Chris@49: { Chris@49: X.at(urow, ii) -= val; Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword ucol=0; ucol < local_n_cols; ++ucol) Chris@49: { Chris@49: arrayops::inplace_minus( colptr(ucol), val, local_n_rows ); Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::operator*= (const eT val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const uword local_n_cols = n_cols; Chris@49: const uword local_n_rows = n_rows; Chris@49: Chris@49: if(local_n_rows == 1) Chris@49: { Chris@49: Mat& X = const_cast< Mat& >(m); Chris@49: Chris@49: const uword urow = aux_row1; Chris@49: const uword start_col = aux_col1; Chris@49: const uword end_col_plus1 = start_col + local_n_cols; Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=start_col, jj=start_col+1; jj < end_col_plus1; ii+=2, jj+=2) Chris@49: { Chris@49: X.at(urow, ii) *= val; Chris@49: X.at(urow, jj) *= val; Chris@49: } Chris@49: Chris@49: if(ii < end_col_plus1) Chris@49: { Chris@49: X.at(urow, ii) *= val; Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword ucol=0; ucol < local_n_cols; ++ucol) Chris@49: { Chris@49: arrayops::inplace_mul( colptr(ucol), val, local_n_rows ); Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::operator/= (const eT val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const uword local_n_cols = n_cols; Chris@49: const uword local_n_rows = n_rows; Chris@49: Chris@49: if(local_n_rows == 1) Chris@49: { Chris@49: Mat& X = const_cast< Mat& >(m); Chris@49: Chris@49: const uword urow = aux_row1; Chris@49: const uword start_col = aux_col1; Chris@49: const uword end_col_plus1 = start_col + local_n_cols; Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=start_col, jj=start_col+1; jj < end_col_plus1; ii+=2, jj+=2) Chris@49: { Chris@49: X.at(urow, ii) /= val; Chris@49: X.at(urow, jj) /= val; Chris@49: } Chris@49: Chris@49: if(ii < end_col_plus1) Chris@49: { Chris@49: X.at(urow, ii) /= val; Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword ucol=0; ucol < local_n_cols; ++ucol) Chris@49: { Chris@49: arrayops::inplace_div( colptr(ucol), val, local_n_rows ); Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::operator= (const Base& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const Proxy P(in.get_ref()); Chris@49: Chris@49: subview& s = *this; Chris@49: Chris@49: const uword s_n_rows = s.n_rows; Chris@49: const uword s_n_cols = s.n_cols; Chris@49: Chris@49: arma_debug_assert_same_size(s, P, "copy into submatrix"); Chris@49: Chris@49: const bool is_alias = P.is_alias(s.m); Chris@49: Chris@49: arma_extra_debug_warn(is_alias, "aliasing detected"); Chris@49: Chris@49: if( (is_Mat::stored_type>::value == true) || (is_alias == true) ) Chris@49: { Chris@49: const unwrap_check::stored_type> tmp(P.Q, is_alias); Chris@49: const Mat& x = tmp.M; Chris@49: Chris@49: if(s_n_rows == 1) Chris@49: { Chris@49: const eT* x_mem = x.memptr(); Chris@49: Chris@49: Mat& A = const_cast< Mat& >(m); Chris@49: Chris@49: const uword urow = aux_row1; Chris@49: const uword start_col = aux_col1; Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2) Chris@49: { Chris@49: A.at(urow, start_col+ii) = x_mem[ii]; Chris@49: A.at(urow, start_col+jj) = x_mem[jj]; Chris@49: } Chris@49: Chris@49: if(ii < s_n_cols) Chris@49: { Chris@49: A.at(urow, start_col+ii) = x_mem[ii]; Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword ucol=0; ucol < s_n_cols; ++ucol) Chris@49: { Chris@49: arrayops::copy( s.colptr(ucol), x.colptr(ucol), s_n_rows ); Chris@49: } Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: if(s_n_rows == 1) Chris@49: { Chris@49: Mat& A = const_cast< Mat& >(m); Chris@49: Chris@49: const uword urow = aux_row1; Chris@49: const uword start_col = aux_col1; Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2) Chris@49: { Chris@49: const eT tmp1 = (Proxy::prefer_at_accessor) ? P.at(0,ii) : P[ii]; Chris@49: const eT tmp2 = (Proxy::prefer_at_accessor) ? P.at(0,jj) : P[jj]; Chris@49: Chris@49: A.at(urow, start_col+ii) = tmp1; Chris@49: A.at(urow, start_col+jj) = tmp2; Chris@49: } Chris@49: Chris@49: if(ii < s_n_cols) Chris@49: { Chris@49: A.at(urow, start_col+ii) = (Proxy::prefer_at_accessor) ? P.at(0,ii) : P[ii]; Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword ucol=0; ucol < s_n_cols; ++ucol) Chris@49: { Chris@49: eT* s_col_data = s.colptr(ucol); Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=0, jj=1; jj < s_n_rows; ii+=2, jj+=2) Chris@49: { Chris@49: const eT tmp1 = P.at(ii,ucol); Chris@49: const eT tmp2 = P.at(jj,ucol); Chris@49: Chris@49: s_col_data[ii] = tmp1; Chris@49: s_col_data[jj] = tmp2; Chris@49: } Chris@49: Chris@49: if(ii < s_n_rows) Chris@49: { Chris@49: s_col_data[ii] = P.at(ii,ucol); Chris@49: } Chris@49: } Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::operator+= (const Base& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const Proxy P(in.get_ref()); Chris@49: Chris@49: subview& s = *this; Chris@49: Chris@49: const uword s_n_rows = s.n_rows; Chris@49: const uword s_n_cols = s.n_cols; Chris@49: Chris@49: arma_debug_assert_same_size(s, P, "addition"); Chris@49: Chris@49: const bool is_alias = P.is_alias(s.m); Chris@49: Chris@49: arma_extra_debug_warn(is_alias, "aliasing detected"); Chris@49: Chris@49: if( (is_Mat::stored_type>::value == true) || (is_alias == true) ) Chris@49: { Chris@49: const unwrap_check::stored_type> tmp(P.Q, is_alias); Chris@49: const Mat& x = tmp.M; Chris@49: Chris@49: if(s_n_rows == 1) Chris@49: { Chris@49: const eT* x_mem = x.memptr(); Chris@49: Chris@49: Mat& A = const_cast< Mat& >(m); Chris@49: Chris@49: const uword urow = aux_row1; Chris@49: const uword start_col = aux_col1; Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2) Chris@49: { Chris@49: A.at(urow, start_col+ii) += x_mem[ii]; Chris@49: A.at(urow, start_col+jj) += x_mem[jj]; Chris@49: } Chris@49: Chris@49: if(ii < s_n_cols) Chris@49: { Chris@49: A.at(urow, start_col+ii) += x_mem[ii]; Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword ucol=0; ucol < s_n_cols; ++ucol) Chris@49: { Chris@49: arrayops::inplace_plus( s.colptr(ucol), x.colptr(ucol), s_n_rows ); Chris@49: } Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: if(s_n_rows == 1) Chris@49: { Chris@49: Mat& A = const_cast< Mat& >(m); Chris@49: Chris@49: const uword urow = aux_row1; Chris@49: const uword start_col = aux_col1; Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2) Chris@49: { Chris@49: const eT tmp1 = (Proxy::prefer_at_accessor) ? P.at(0,ii) : P[ii]; Chris@49: const eT tmp2 = (Proxy::prefer_at_accessor) ? P.at(0,jj) : P[jj]; Chris@49: Chris@49: A.at(urow, start_col+ii) += tmp1; Chris@49: A.at(urow, start_col+jj) += tmp2; Chris@49: } Chris@49: Chris@49: if(ii < s_n_cols) Chris@49: { Chris@49: A.at(urow, start_col+ii) += (Proxy::prefer_at_accessor) ? P.at(0,ii) : P[ii]; Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword ucol=0; ucol < s_n_cols; ++ucol) Chris@49: { Chris@49: eT* s_col_data = s.colptr(ucol); Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=0, jj=1; jj < s_n_rows; ii+=2, jj+=2) Chris@49: { Chris@49: const eT val1 = P.at(ii,ucol); Chris@49: const eT val2 = P.at(jj,ucol); Chris@49: Chris@49: s_col_data[ii] += val1; Chris@49: s_col_data[jj] += val2; Chris@49: } Chris@49: Chris@49: if(ii < s_n_rows) Chris@49: { Chris@49: s_col_data[ii] += P.at(ii,ucol); Chris@49: } Chris@49: } Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::operator-= (const Base& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const Proxy P(in.get_ref()); Chris@49: Chris@49: subview& s = *this; Chris@49: Chris@49: const uword s_n_rows = s.n_rows; Chris@49: const uword s_n_cols = s.n_cols; Chris@49: Chris@49: arma_debug_assert_same_size(s, P, "subtraction"); Chris@49: Chris@49: const bool is_alias = P.is_alias(s.m); Chris@49: Chris@49: arma_extra_debug_warn(is_alias, "aliasing detected"); Chris@49: Chris@49: if( (is_Mat::stored_type>::value == true) || (is_alias == true) ) Chris@49: { Chris@49: const unwrap_check::stored_type> tmp(P.Q, is_alias); Chris@49: const Mat& x = tmp.M; Chris@49: Chris@49: if(s_n_rows == 1) Chris@49: { Chris@49: const eT* x_mem = x.memptr(); Chris@49: Chris@49: Mat& A = const_cast< Mat& >(m); Chris@49: Chris@49: const uword urow = aux_row1; Chris@49: const uword start_col = aux_col1; Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2) Chris@49: { Chris@49: A.at(urow, start_col+ii) -= x_mem[ii]; Chris@49: A.at(urow, start_col+jj) -= x_mem[jj]; Chris@49: } Chris@49: Chris@49: if(ii < s_n_cols) Chris@49: { Chris@49: A.at(urow, start_col+ii) -= x_mem[ii]; Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword ucol=0; ucol < s_n_cols; ++ucol) Chris@49: { Chris@49: arrayops::inplace_minus( s.colptr(ucol), x.colptr(ucol), s_n_rows ); Chris@49: } Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: if(s_n_rows == 1) Chris@49: { Chris@49: Mat& A = const_cast< Mat& >(m); Chris@49: Chris@49: const uword urow = aux_row1; Chris@49: const uword start_col = aux_col1; Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2) Chris@49: { Chris@49: const eT tmp1 = (Proxy::prefer_at_accessor) ? P.at(0,ii) : P[ii]; Chris@49: const eT tmp2 = (Proxy::prefer_at_accessor) ? P.at(0,jj) : P[jj]; Chris@49: Chris@49: A.at(urow, start_col+ii) -= tmp1; Chris@49: A.at(urow, start_col+jj) -= tmp2; Chris@49: } Chris@49: Chris@49: if(ii < s_n_cols) Chris@49: { Chris@49: A.at(urow, start_col+ii) -= (Proxy::prefer_at_accessor) ? P.at(0,ii) : P[ii]; Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword ucol=0; ucol < s_n_cols; ++ucol) Chris@49: { Chris@49: eT* s_col_data = s.colptr(ucol); Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=0, jj=1; jj < s_n_rows; ii+=2, jj+=2) Chris@49: { Chris@49: const eT val1 = P.at(ii,ucol); Chris@49: const eT val2 = P.at(jj,ucol); Chris@49: Chris@49: s_col_data[ii] -= val1; Chris@49: s_col_data[jj] -= val2; Chris@49: } Chris@49: Chris@49: if(ii < s_n_rows) Chris@49: { Chris@49: s_col_data[ii] -= P.at(ii,ucol); Chris@49: } Chris@49: } Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::operator%= (const Base& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const Proxy P(in.get_ref()); Chris@49: Chris@49: subview& s = *this; Chris@49: Chris@49: const uword s_n_rows = s.n_rows; Chris@49: const uword s_n_cols = s.n_cols; Chris@49: Chris@49: arma_debug_assert_same_size(s, P, "element-wise multiplication"); Chris@49: Chris@49: const bool is_alias = P.is_alias(s.m); Chris@49: Chris@49: arma_extra_debug_warn(is_alias, "aliasing detected"); Chris@49: Chris@49: if( (is_Mat::stored_type>::value == true) || (is_alias == true) ) Chris@49: { Chris@49: const unwrap_check::stored_type> tmp(P.Q, is_alias); Chris@49: const Mat& x = tmp.M; Chris@49: Chris@49: if(s_n_rows == 1) Chris@49: { Chris@49: const eT* x_mem = x.memptr(); Chris@49: Chris@49: Mat& A = const_cast< Mat& >(m); Chris@49: Chris@49: const uword urow = aux_row1; Chris@49: const uword start_col = aux_col1; Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2) Chris@49: { Chris@49: A.at(urow, start_col+ii) *= x_mem[ii]; Chris@49: A.at(urow, start_col+jj) *= x_mem[jj]; Chris@49: } Chris@49: Chris@49: if(ii < s_n_cols) Chris@49: { Chris@49: A.at(urow, start_col+ii) *= x_mem[ii]; Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword ucol=0; ucol < s_n_cols; ++ucol) Chris@49: { Chris@49: arrayops::inplace_mul( s.colptr(ucol), x.colptr(ucol), s_n_rows ); Chris@49: } Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: if(s_n_rows == 1) Chris@49: { Chris@49: Mat& A = const_cast< Mat& >(m); Chris@49: Chris@49: const uword urow = aux_row1; Chris@49: const uword start_col = aux_col1; Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2) Chris@49: { Chris@49: const eT tmp1 = (Proxy::prefer_at_accessor) ? P.at(0,ii) : P[ii]; Chris@49: const eT tmp2 = (Proxy::prefer_at_accessor) ? P.at(0,jj) : P[jj]; Chris@49: Chris@49: A.at(urow, start_col+ii) *= tmp1; Chris@49: A.at(urow, start_col+jj) *= tmp2; Chris@49: } Chris@49: Chris@49: if(ii < s_n_cols) Chris@49: { Chris@49: A.at(urow, start_col+ii) *= (Proxy::prefer_at_accessor) ? P.at(0,ii) : P[ii]; Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword ucol=0; ucol < s_n_cols; ++ucol) Chris@49: { Chris@49: eT* s_col_data = s.colptr(ucol); Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=0, jj=1; jj < s_n_rows; ii+=2, jj+=2) Chris@49: { Chris@49: const eT val1 = P.at(ii,ucol); Chris@49: const eT val2 = P.at(jj,ucol); Chris@49: Chris@49: s_col_data[ii] *= val1; Chris@49: s_col_data[jj] *= val2; Chris@49: } Chris@49: Chris@49: if(ii < s_n_rows) Chris@49: { Chris@49: s_col_data[ii] *= P.at(ii,ucol); Chris@49: } Chris@49: } Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::operator/= (const Base& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const Proxy P(in.get_ref()); Chris@49: Chris@49: subview& s = *this; Chris@49: Chris@49: const uword s_n_rows = s.n_rows; Chris@49: const uword s_n_cols = s.n_cols; Chris@49: Chris@49: arma_debug_assert_same_size(s, P, "element-wise division"); Chris@49: Chris@49: const bool is_alias = P.is_alias(s.m); Chris@49: Chris@49: arma_extra_debug_warn(is_alias, "aliasing detected"); Chris@49: Chris@49: if( (is_Mat::stored_type>::value == true) || (is_alias == true) ) Chris@49: { Chris@49: const unwrap_check::stored_type> tmp(P.Q, is_alias); Chris@49: const Mat& x = tmp.M; Chris@49: Chris@49: if(s_n_rows == 1) Chris@49: { Chris@49: const eT* x_mem = x.memptr(); Chris@49: Chris@49: Mat& A = const_cast< Mat& >(m); Chris@49: Chris@49: const uword urow = aux_row1; Chris@49: const uword start_col = aux_col1; Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2) Chris@49: { Chris@49: A.at(urow, start_col+ii) /= x_mem[ii]; Chris@49: A.at(urow, start_col+jj) /= x_mem[jj]; Chris@49: } Chris@49: Chris@49: if(ii < s_n_cols) Chris@49: { Chris@49: A.at(urow, start_col+ii) /= x_mem[ii]; Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword ucol=0; ucol < s_n_cols; ++ucol) Chris@49: { Chris@49: arrayops::inplace_div( s.colptr(ucol), x.colptr(ucol), s_n_rows ); Chris@49: } Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: if(s_n_rows == 1) Chris@49: { Chris@49: Mat& A = const_cast< Mat& >(m); Chris@49: Chris@49: const uword urow = aux_row1; Chris@49: const uword start_col = aux_col1; Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2) Chris@49: { Chris@49: const eT tmp1 = (Proxy::prefer_at_accessor) ? P.at(0,ii) : P[ii]; Chris@49: const eT tmp2 = (Proxy::prefer_at_accessor) ? P.at(0,jj) : P[jj]; Chris@49: Chris@49: A.at(urow, start_col+ii) /= tmp1; Chris@49: A.at(urow, start_col+jj) /= tmp2; Chris@49: } Chris@49: Chris@49: if(ii < s_n_cols) Chris@49: { Chris@49: A.at(urow, start_col+ii) /= (Proxy::prefer_at_accessor) ? P.at(0,ii) : P[ii]; Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword ucol=0; ucol < s_n_cols; ++ucol) Chris@49: { Chris@49: eT* s_col_data = s.colptr(ucol); Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=0, jj=1; jj < s_n_rows; ii+=2, jj+=2) Chris@49: { Chris@49: const eT val1 = P.at(ii,ucol); Chris@49: const eT val2 = P.at(jj,ucol); Chris@49: Chris@49: s_col_data[ii] /= val1; Chris@49: s_col_data[jj] /= val2; Chris@49: } Chris@49: Chris@49: if(ii < s_n_rows) Chris@49: { Chris@49: s_col_data[ii] /= P.at(ii,ucol); Chris@49: } Chris@49: } Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! x.submat(...) = y.submat(...) Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::operator= (const subview& 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: Mat* tmp_mat = overlap ? new Mat(x_in.m) : 0; Chris@49: const subview* tmp_subview = overlap ? new subview(*tmp_mat, x_in.aux_row1, x_in.aux_col1, x_in.n_rows, x_in.n_cols) : 0; Chris@49: const subview& x = overlap ? (*tmp_subview) : x_in; Chris@49: Chris@49: subview& s = *this; Chris@49: Chris@49: arma_debug_assert_same_size(s, x, "copy into submatrix"); Chris@49: Chris@49: const uword s_n_cols = s.n_cols; Chris@49: const uword s_n_rows = s.n_rows; Chris@49: Chris@49: if(s_n_rows == 1) Chris@49: { Chris@49: Mat& A = const_cast< Mat& >(s.m); Chris@49: const Mat& B = x.m; Chris@49: Chris@49: const uword row_A = s.aux_row1; Chris@49: const uword row_B = x.aux_row1; Chris@49: Chris@49: const uword start_col_A = s.aux_col1; Chris@49: const uword start_col_B = x.aux_col1; Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2) Chris@49: { Chris@49: const eT tmp1 = B.at(row_B, start_col_B + ii); Chris@49: const eT tmp2 = B.at(row_B, start_col_B + jj); Chris@49: Chris@49: A.at(row_A, start_col_A + ii) = tmp1; Chris@49: A.at(row_A, start_col_A + jj) = tmp2; Chris@49: } Chris@49: Chris@49: if(ii < s_n_cols) Chris@49: { Chris@49: A.at(row_A, start_col_A + ii) = B.at(row_B, start_col_B + ii); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword ucol=0; ucol < s_n_cols; ++ucol) Chris@49: { Chris@49: arrayops::copy( s.colptr(ucol), x.colptr(ucol), s_n_rows ); Chris@49: } Chris@49: } Chris@49: Chris@49: if(overlap) Chris@49: { Chris@49: delete tmp_subview; Chris@49: delete tmp_mat; Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::operator+= (const subview& 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: Mat* tmp_mat = overlap ? new Mat(x_in.m) : 0; Chris@49: const subview* tmp_subview = overlap ? new subview(*tmp_mat, x_in.aux_row1, x_in.aux_col1, x_in.n_rows, x_in.n_cols) : 0; Chris@49: const subview& x = overlap ? (*tmp_subview) : x_in; Chris@49: Chris@49: subview& s = *this; Chris@49: Chris@49: arma_debug_assert_same_size(s, x, "addition"); Chris@49: Chris@49: const uword s_n_rows = s.n_rows; Chris@49: const uword s_n_cols = s.n_cols; Chris@49: Chris@49: if(s_n_rows == 1) Chris@49: { Chris@49: Mat& A = const_cast< Mat& >(s.m); Chris@49: const Mat& B = x.m; Chris@49: Chris@49: const uword row_A = s.aux_row1; Chris@49: const uword row_B = x.aux_row1; Chris@49: Chris@49: const uword start_col_A = s.aux_col1; Chris@49: const uword start_col_B = x.aux_col1; Chris@49: Chris@49: uword ii,jj; Chris@49: Chris@49: for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2) Chris@49: { Chris@49: const eT tmp1 = B.at(row_B, start_col_B + ii); Chris@49: const eT tmp2 = B.at(row_B, start_col_B + jj); Chris@49: Chris@49: A.at(row_A, start_col_A + ii) += tmp1; Chris@49: A.at(row_A, start_col_A + jj) += tmp2; Chris@49: } Chris@49: Chris@49: if(ii < s_n_cols) Chris@49: { Chris@49: A.at(row_A, start_col_A + ii) += B.at(row_B, start_col_B + ii); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword ucol=0; ucol < s_n_cols; ++ucol) Chris@49: { Chris@49: arrayops::inplace_plus( s.colptr(ucol), x.colptr(ucol), s_n_rows ); Chris@49: } Chris@49: } Chris@49: Chris@49: if(overlap) Chris@49: { Chris@49: delete tmp_subview; Chris@49: delete tmp_mat; Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::operator-= (const subview& 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: Mat* tmp_mat = overlap ? new Mat(x_in.m) : 0; Chris@49: const subview* tmp_subview = overlap ? new subview(*tmp_mat, x_in.aux_row1, x_in.aux_col1, x_in.n_rows, x_in.n_cols) : 0; Chris@49: const subview& x = overlap ? (*tmp_subview) : x_in; Chris@49: Chris@49: subview& s = *this; Chris@49: Chris@49: arma_debug_assert_same_size(s, x, "subtraction"); Chris@49: Chris@49: const uword s_n_rows = s.n_rows; Chris@49: const uword s_n_cols = s.n_cols; Chris@49: Chris@49: if(s_n_rows == 1) Chris@49: { Chris@49: Mat& A = const_cast< Mat& >(s.m); Chris@49: const Mat& B = x.m; Chris@49: Chris@49: const uword row_A = s.aux_row1; Chris@49: const uword row_B = x.aux_row1; Chris@49: Chris@49: const uword start_col_A = s.aux_col1; Chris@49: const uword start_col_B = x.aux_col1; Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2) Chris@49: { Chris@49: const eT tmp1 = B.at(row_B, start_col_B + ii); Chris@49: const eT tmp2 = B.at(row_B, start_col_B + jj); Chris@49: Chris@49: A.at(row_A, start_col_A + ii) -= tmp1; Chris@49: A.at(row_A, start_col_A + jj) -= tmp2; Chris@49: } Chris@49: Chris@49: if(ii < s_n_cols) Chris@49: { Chris@49: A.at(row_A, start_col_A + ii) -= B.at(row_B, start_col_B + ii); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword ucol=0; ucol < s_n_cols; ++ucol) Chris@49: { Chris@49: arrayops::inplace_minus( s.colptr(ucol), x.colptr(ucol), s_n_rows ); Chris@49: } Chris@49: } Chris@49: Chris@49: if(overlap) Chris@49: { Chris@49: delete tmp_subview; Chris@49: delete tmp_mat; Chris@49: } Chris@49: Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::operator%= (const subview& 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: Mat* tmp_mat = overlap ? new Mat(x_in.m) : 0; Chris@49: const subview* tmp_subview = overlap ? new subview(*tmp_mat, x_in.aux_row1, x_in.aux_col1, x_in.n_rows, x_in.n_cols) : 0; Chris@49: const subview& x = overlap ? (*tmp_subview) : x_in; Chris@49: Chris@49: subview& s = *this; Chris@49: Chris@49: arma_debug_assert_same_size(s, x, "element-wise multiplication"); Chris@49: Chris@49: const uword s_n_rows = s.n_rows; Chris@49: const uword s_n_cols = s.n_cols; Chris@49: Chris@49: if(s_n_rows == 1) Chris@49: { Chris@49: Mat& A = const_cast< Mat& >(s.m); Chris@49: const Mat& B = x.m; Chris@49: Chris@49: const uword row_A = s.aux_row1; Chris@49: const uword row_B = x.aux_row1; Chris@49: Chris@49: const uword start_col_A = s.aux_col1; Chris@49: const uword start_col_B = x.aux_col1; Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2) Chris@49: { Chris@49: const eT tmp1 = B.at(row_B, start_col_B + ii); Chris@49: const eT tmp2 = B.at(row_B, start_col_B + jj); Chris@49: Chris@49: A.at(row_A, start_col_A + ii) *= tmp1; Chris@49: A.at(row_A, start_col_A + jj) *= tmp2; Chris@49: } Chris@49: Chris@49: if(ii < s_n_cols) Chris@49: { Chris@49: A.at(row_A, start_col_A + ii) *= B.at(row_B, start_col_B + ii); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword ucol=0; ucol < s_n_cols; ++ucol) Chris@49: { Chris@49: arrayops::inplace_mul( s.colptr(ucol), x.colptr(ucol), s_n_rows ); Chris@49: } Chris@49: } Chris@49: Chris@49: if(overlap) Chris@49: { Chris@49: delete tmp_subview; Chris@49: delete tmp_mat; Chris@49: } Chris@49: Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::operator/= (const subview& 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: Mat* tmp_mat = overlap ? new Mat(x_in.m) : 0; Chris@49: const subview* tmp_subview = overlap ? new subview(*tmp_mat, x_in.aux_row1, x_in.aux_col1, x_in.n_rows, x_in.n_cols) : 0; Chris@49: const subview& x = overlap ? (*tmp_subview) : x_in; Chris@49: Chris@49: subview& s = *this; Chris@49: Chris@49: arma_debug_assert_same_size(s, x, "element-wise division"); Chris@49: Chris@49: const uword s_n_rows = s.n_rows; Chris@49: const uword s_n_cols = s.n_cols; Chris@49: Chris@49: if(s_n_rows == 1) Chris@49: { Chris@49: Mat& A = const_cast< Mat& >(s.m); Chris@49: const Mat& B = x.m; Chris@49: Chris@49: const uword row_A = s.aux_row1; Chris@49: const uword row_B = x.aux_row1; Chris@49: Chris@49: const uword start_col_A = s.aux_col1; Chris@49: const uword start_col_B = x.aux_col1; Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2) Chris@49: { Chris@49: const eT tmp1 = B.at(row_B, start_col_B + ii); Chris@49: const eT tmp2 = B.at(row_B, start_col_B + jj); Chris@49: Chris@49: A.at(row_A, start_col_A + ii) /= tmp1; Chris@49: A.at(row_A, start_col_A + jj) /= tmp2; Chris@49: } Chris@49: Chris@49: if(ii < s_n_cols) Chris@49: { Chris@49: A.at(row_A, start_col_A + ii) /= B.at(row_B, start_col_B + ii); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword ucol=0; ucol < s_n_cols; ++ucol) Chris@49: { Chris@49: arrayops::inplace_div( s.colptr(ucol), x.colptr(ucol), s_n_rows ); Chris@49: } Chris@49: } Chris@49: Chris@49: if(overlap) Chris@49: { Chris@49: delete tmp_subview; Chris@49: delete tmp_mat; Chris@49: } Chris@49: Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! transform each element in the subview using a functor Chris@49: template Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::transform(functor F) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const uword local_n_cols = n_cols; Chris@49: const uword local_n_rows = n_rows; Chris@49: Chris@49: Mat& X = const_cast< Mat& >(m); Chris@49: Chris@49: if(local_n_rows == 1) Chris@49: { Chris@49: const uword urow = aux_row1; Chris@49: const uword start_col = aux_col1; Chris@49: const uword end_col_plus1 = start_col + local_n_cols; Chris@49: Chris@49: for(uword ucol = start_col; ucol < end_col_plus1; ++ucol) Chris@49: { Chris@49: X.at(urow, ucol) = eT( F( X.at(urow, ucol) ) ); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: const uword start_col = aux_col1; Chris@49: const uword start_row = aux_row1; Chris@49: Chris@49: const uword end_col_plus1 = start_col + local_n_cols; Chris@49: const uword end_row_plus1 = start_row + local_n_rows; Chris@49: Chris@49: for(uword ucol = start_col; ucol < end_col_plus1; ++ucol) Chris@49: for(uword urow = start_row; urow < end_row_plus1; ++urow) Chris@49: { Chris@49: X.at(urow, ucol) = eT( F( X.at(urow, ucol) ) ); Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! imbue (fill) the subview with values provided by a functor Chris@49: template Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::imbue(functor F) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const uword local_n_cols = n_cols; Chris@49: const uword local_n_rows = n_rows; Chris@49: Chris@49: Mat& X = const_cast< Mat& >(m); Chris@49: Chris@49: if(local_n_rows == 1) Chris@49: { Chris@49: const uword urow = aux_row1; Chris@49: const uword start_col = aux_col1; Chris@49: const uword end_col_plus1 = start_col + local_n_cols; Chris@49: Chris@49: for(uword ucol = start_col; ucol < end_col_plus1; ++ucol) Chris@49: { Chris@49: X.at(urow, ucol) = eT( F() ); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: const uword start_col = aux_col1; Chris@49: const uword start_row = aux_row1; Chris@49: Chris@49: const uword end_col_plus1 = start_col + local_n_cols; Chris@49: const uword end_row_plus1 = start_row + local_n_rows; Chris@49: Chris@49: for(uword ucol = start_col; ucol < end_col_plus1; ++ucol) Chris@49: for(uword urow = start_row; urow < end_row_plus1; ++urow) Chris@49: { Chris@49: X.at(urow, ucol) = eT( F() ); Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::fill(const eT val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const uword local_n_cols = n_cols; Chris@49: const uword local_n_rows = n_rows; Chris@49: Chris@49: if(local_n_rows == 1) Chris@49: { Chris@49: Mat& X = const_cast< Mat& >(m); Chris@49: Chris@49: const uword urow = aux_row1; Chris@49: const uword start_col = aux_col1; Chris@49: const uword end_col_plus1 = start_col + local_n_cols; Chris@49: Chris@49: uword ii,jj; Chris@49: for(ii=start_col, jj=start_col+1; jj < end_col_plus1; ii+=2, jj+=2) Chris@49: { Chris@49: X.at(urow, ii) = val; Chris@49: X.at(urow, jj) = val; Chris@49: } Chris@49: Chris@49: if(ii < end_col_plus1) Chris@49: { Chris@49: X.at(urow, ii) = val; Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword ucol=0; ucol < local_n_cols; ++ucol) Chris@49: { Chris@49: arrayops::inplace_set( colptr(ucol), val, local_n_rows ); Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::zeros() Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: (*this).fill(eT(0)); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::ones() Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: (*this).fill(eT(1)); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::eye() Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: fill(eT(0)); Chris@49: Chris@49: const uword N = (std::min)(n_rows, n_cols); Chris@49: Chris@49: for(uword ii=0; ii < N; ++ii) Chris@49: { Chris@49: at(ii,ii) = eT(1); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT Chris@49: subview::at_alt(const uword ii) const Chris@49: { Chris@49: return operator[](ii); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT& Chris@49: subview::operator[](const uword ii) Chris@49: { Chris@49: const uword in_col = ii / n_rows; Chris@49: const uword in_row = ii % n_rows; Chris@49: Chris@49: const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; Chris@49: Chris@49: return access::rw( (const_cast< Mat& >(m)).mem[index] ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT Chris@49: subview::operator[](const uword ii) const Chris@49: { Chris@49: const uword in_col = ii / n_rows; Chris@49: const uword in_row = ii % n_rows; Chris@49: Chris@49: const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; Chris@49: Chris@49: return m.mem[index]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT& Chris@49: subview::operator()(const uword ii) Chris@49: { Chris@49: arma_debug_check( (ii >= n_elem), "subview::operator(): index out of bounds"); Chris@49: Chris@49: const uword in_col = ii / n_rows; Chris@49: const uword in_row = ii % n_rows; Chris@49: Chris@49: const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; Chris@49: Chris@49: return access::rw( (const_cast< Mat& >(m)).mem[index] ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT Chris@49: subview::operator()(const uword ii) const Chris@49: { Chris@49: arma_debug_check( (ii >= n_elem), "subview::operator(): index out of bounds"); Chris@49: Chris@49: const uword in_col = ii / n_rows; Chris@49: const uword in_row = ii % n_rows; Chris@49: Chris@49: const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; Chris@49: Chris@49: return m.mem[index]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT& Chris@49: subview::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::operator(): index out of bounds"); Chris@49: Chris@49: const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; Chris@49: Chris@49: return access::rw( (const_cast< Mat& >(m)).mem[index] ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT Chris@49: subview::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::operator(): index out of bounds"); Chris@49: Chris@49: const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; Chris@49: Chris@49: return m.mem[index]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT& Chris@49: subview::at(const uword in_row, const uword in_col) Chris@49: { Chris@49: const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; Chris@49: Chris@49: return access::rw( (const_cast< Mat& >(m)).mem[index] ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT Chris@49: subview::at(const uword in_row, const uword in_col) const Chris@49: { Chris@49: const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; Chris@49: Chris@49: return m.mem[index]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: eT* Chris@49: subview::colptr(const uword in_col) Chris@49: { Chris@49: return & access::rw((const_cast< Mat& >(m)).mem[ (in_col + aux_col1)*m.n_rows + aux_row1 ]); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const eT* Chris@49: subview::colptr(const uword in_col) const Chris@49: { Chris@49: return & m.mem[ (in_col + aux_col1)*m.n_rows + aux_row1 ]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: bool Chris@49: subview::check_overlap(const subview& x) const Chris@49: { Chris@49: const subview& s = *this; Chris@49: Chris@49: if(&s.m != &x.m) Chris@49: { Chris@49: return false; Chris@49: } Chris@49: else Chris@49: { Chris@49: if( (s.n_elem == 0) || (x.n_elem == 0) ) Chris@49: { Chris@49: return false; Chris@49: } Chris@49: else Chris@49: { Chris@49: const uword s_row_start = s.aux_row1; Chris@49: const uword s_row_end_p1 = s_row_start + s.n_rows; Chris@49: Chris@49: const uword s_col_start = s.aux_col1; Chris@49: const uword s_col_end_p1 = s_col_start + s.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 >= s_row_end_p1) || (s_row_start >= x_row_end_p1) ); Chris@49: const bool outside_cols = ( (x_col_start >= s_col_end_p1) || (s_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: template Chris@49: inline Chris@49: bool Chris@49: subview::is_vec() const Chris@49: { Chris@49: return ( (n_rows == 1) || (n_cols == 1) ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! X = Y.submat(...) Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::extract(Mat& out, const subview& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: // NOTE: we're assuming that the matrix has already been set to the correct size and there is no aliasing; Chris@49: // size setting and alias checking is done by either the Mat contructor or operator=() Chris@49: Chris@49: const uword n_rows = in.n_rows; // number of rows in the subview Chris@49: const uword n_cols = in.n_cols; // number of columns in the subview 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.m.n_rows % in.m.n_cols ); Chris@49: Chris@49: Chris@49: if(in.is_vec() == true) Chris@49: { Chris@49: if(n_cols == 1) // a column vector Chris@49: { Chris@49: arma_extra_debug_print("subview::extract(): copying col (going across rows)"); Chris@49: Chris@49: // in.colptr(0) the first column of the subview, taking into account any row offset Chris@49: arrayops::copy( out.memptr(), in.colptr(0), n_rows ); Chris@49: } Chris@49: else // a row vector (possibly empty) Chris@49: { Chris@49: arma_extra_debug_print("subview::extract(): copying row (going across columns)"); Chris@49: Chris@49: const Mat& X = in.m; Chris@49: Chris@49: eT* out_mem = out.memptr(); Chris@49: Chris@49: const uword row = in.aux_row1; Chris@49: const uword start_col = in.aux_col1; Chris@49: Chris@49: uword i,j; Chris@49: Chris@49: for(i=0, j=1; j < n_cols; i+=2, j+=2) Chris@49: { Chris@49: const eT tmp1 = X.at(row, start_col+i); Chris@49: const eT tmp2 = X.at(row, start_col+j); Chris@49: Chris@49: out_mem[i] = tmp1; Chris@49: out_mem[j] = tmp2; Chris@49: } Chris@49: Chris@49: if(i < n_cols) Chris@49: { Chris@49: out_mem[i] = X.at(row, start_col+i); Chris@49: } Chris@49: } Chris@49: } Chris@49: else // general submatrix Chris@49: { Chris@49: arma_extra_debug_print("subview::extract(): general submatrix"); Chris@49: Chris@49: for(uword col=0; col < n_cols; ++col) Chris@49: { Chris@49: arrayops::copy( out.colptr(col), in.colptr(col), n_rows ); Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! X += Y.submat(...) Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::plus_inplace(Mat& out, const subview& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_assert_same_size(out, in, "addition"); Chris@49: Chris@49: const uword n_rows = in.n_rows; Chris@49: const uword n_cols = in.n_cols; Chris@49: Chris@49: if(n_rows == 1) Chris@49: { Chris@49: eT* out_mem = out.memptr(); Chris@49: Chris@49: const Mat& X = in.m; Chris@49: Chris@49: const uword row = in.aux_row1; Chris@49: const uword start_col = in.aux_col1; Chris@49: Chris@49: uword i,j; Chris@49: for(i=0, j=1; j < n_cols; i+=2, j+=2) Chris@49: { Chris@49: const eT tmp1 = X.at(row, start_col+i); Chris@49: const eT tmp2 = X.at(row, start_col+j); Chris@49: Chris@49: out_mem[i] += tmp1; Chris@49: out_mem[j] += tmp2; Chris@49: } Chris@49: Chris@49: if(i < n_cols) Chris@49: { Chris@49: out_mem[i] += X.at(row, start_col+i); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword col=0; col < n_cols; ++col) Chris@49: { Chris@49: arrayops::inplace_plus(out.colptr(col), in.colptr(col), n_rows); Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! X -= Y.submat(...) Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::minus_inplace(Mat& out, const subview& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_assert_same_size(out, in, "subtraction"); Chris@49: Chris@49: const uword n_rows = in.n_rows; Chris@49: const uword n_cols = in.n_cols; Chris@49: Chris@49: if(n_rows == 1) Chris@49: { Chris@49: eT* out_mem = out.memptr(); Chris@49: Chris@49: const Mat& X = in.m; Chris@49: Chris@49: const uword row = in.aux_row1; Chris@49: const uword start_col = in.aux_col1; Chris@49: Chris@49: uword i,j; Chris@49: for(i=0, j=1; j < n_cols; i+=2, j+=2) Chris@49: { Chris@49: const eT tmp1 = X.at(row, start_col+i); Chris@49: const eT tmp2 = X.at(row, start_col+j); Chris@49: Chris@49: out_mem[i] -= tmp1; Chris@49: out_mem[j] -= tmp2; Chris@49: } Chris@49: Chris@49: if(i < n_cols) Chris@49: { Chris@49: out_mem[i] -= X.at(row, start_col+i); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword col=0; col < n_cols; ++col) Chris@49: { Chris@49: arrayops::inplace_minus(out.colptr(col), in.colptr(col), n_rows); Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! X %= Y.submat(...) Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::schur_inplace(Mat& out, const subview& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_assert_same_size(out, in, "element-wise multiplication"); Chris@49: Chris@49: const uword n_rows = in.n_rows; Chris@49: const uword n_cols = in.n_cols; Chris@49: Chris@49: if(n_rows == 1) Chris@49: { Chris@49: eT* out_mem = out.memptr(); Chris@49: Chris@49: const Mat& X = in.m; Chris@49: Chris@49: const uword row = in.aux_row1; Chris@49: const uword start_col = in.aux_col1; Chris@49: Chris@49: uword i,j; Chris@49: for(i=0, j=1; j < n_cols; i+=2, j+=2) Chris@49: { Chris@49: const eT tmp1 = X.at(row, start_col+i); Chris@49: const eT tmp2 = X.at(row, start_col+j); Chris@49: Chris@49: out_mem[i] *= tmp1; Chris@49: out_mem[j] *= tmp2; Chris@49: } Chris@49: Chris@49: if(i < n_cols) Chris@49: { Chris@49: out_mem[i] *= X.at(row, start_col+i); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword col=0; col < n_cols; ++col) Chris@49: { Chris@49: arrayops::inplace_mul(out.colptr(col), in.colptr(col), n_rows); Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! X /= Y.submat(...) Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::div_inplace(Mat& out, const subview& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_assert_same_size(out, in, "element-wise division"); Chris@49: Chris@49: const uword n_rows = in.n_rows; Chris@49: const uword n_cols = in.n_cols; Chris@49: Chris@49: if(n_rows == 1) Chris@49: { Chris@49: eT* out_mem = out.memptr(); Chris@49: Chris@49: const Mat& X = in.m; Chris@49: Chris@49: const uword row = in.aux_row1; Chris@49: const uword start_col = in.aux_col1; Chris@49: Chris@49: uword i,j; Chris@49: for(i=0, j=1; j < n_cols; i+=2, j+=2) Chris@49: { Chris@49: const eT tmp1 = X.at(row, start_col+i); Chris@49: const eT tmp2 = X.at(row, start_col+j); Chris@49: Chris@49: out_mem[i] /= tmp1; Chris@49: out_mem[j] /= tmp2; Chris@49: } Chris@49: Chris@49: if(i < n_cols) Chris@49: { Chris@49: out_mem[i] /= X.at(row, start_col+i); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword col=0; col < n_cols; ++col) Chris@49: { Chris@49: arrayops::inplace_div(out.colptr(col), in.colptr(col), n_rows); Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! creation of subview (row vector) Chris@49: template Chris@49: inline Chris@49: subview_row Chris@49: subview::row(const uword row_num) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( row_num >= n_rows, "subview::row(): out of bounds" ); Chris@49: Chris@49: const uword base_row = aux_row1 + row_num; Chris@49: Chris@49: return subview_row(m, base_row, aux_col1, n_cols); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! creation of subview (row vector) Chris@49: template Chris@49: inline Chris@49: const subview_row Chris@49: subview::row(const uword row_num) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( row_num >= n_rows, "subview::row(): out of bounds" ); Chris@49: Chris@49: const uword base_row = aux_row1 + row_num; Chris@49: Chris@49: return subview_row(m, base_row, aux_col1, n_cols); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: subview_row Chris@49: subview::operator()(const uword row_num, const span& col_span) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const bool col_all = col_span.whole; Chris@49: Chris@49: const uword local_n_cols = n_cols; Chris@49: Chris@49: const uword in_col1 = col_all ? 0 : col_span.a; Chris@49: const uword in_col2 = col_span.b; Chris@49: const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; Chris@49: Chris@49: const uword base_col1 = aux_col1 + in_col1; Chris@49: const uword base_row = aux_row1 + row_num; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: (row_num >= n_rows) Chris@49: || Chris@49: ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) Chris@49: , Chris@49: "subview::operator(): indices out of bounds or incorrectly used" Chris@49: ); Chris@49: Chris@49: return subview_row(m, base_row, base_col1, submat_n_cols); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const subview_row Chris@49: subview::operator()(const uword row_num, const span& col_span) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const bool col_all = col_span.whole; Chris@49: Chris@49: const uword local_n_cols = n_cols; Chris@49: Chris@49: const uword in_col1 = col_all ? 0 : col_span.a; Chris@49: const uword in_col2 = col_span.b; Chris@49: const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; Chris@49: Chris@49: const uword base_col1 = aux_col1 + in_col1; Chris@49: const uword base_row = aux_row1 + row_num; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: (row_num >= n_rows) Chris@49: || Chris@49: ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) Chris@49: , Chris@49: "subview::operator(): indices out of bounds or incorrectly used" Chris@49: ); Chris@49: Chris@49: return subview_row(m, base_row, base_col1, submat_n_cols); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! creation of subview (column vector) Chris@49: template Chris@49: inline Chris@49: subview_col Chris@49: subview::col(const uword col_num) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( col_num >= n_cols, "subview::col(): out of bounds"); Chris@49: Chris@49: const uword base_col = aux_col1 + col_num; Chris@49: Chris@49: return subview_col(m, base_col, aux_row1, n_rows); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! creation of subview (column vector) Chris@49: template Chris@49: inline Chris@49: const subview_col Chris@49: subview::col(const uword col_num) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( col_num >= n_cols, "subview::col(): out of bounds"); Chris@49: Chris@49: const uword base_col = aux_col1 + col_num; Chris@49: Chris@49: return subview_col(m, base_col, aux_row1, n_rows); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: subview_col Chris@49: subview::operator()(const span& row_span, const uword col_num) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const bool row_all = row_span.whole; Chris@49: Chris@49: const uword local_n_rows = n_rows; Chris@49: Chris@49: const uword in_row1 = row_all ? 0 : row_span.a; Chris@49: const uword in_row2 = row_span.b; Chris@49: const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; Chris@49: Chris@49: const uword base_row1 = aux_row1 + in_row1; Chris@49: const uword base_col = aux_col1 + col_num; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: (col_num >= n_cols) Chris@49: || Chris@49: ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) Chris@49: , Chris@49: "subview::operator(): indices out of bounds or incorrectly used" Chris@49: ); Chris@49: Chris@49: return subview_col(m, base_col, base_row1, submat_n_rows); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const subview_col Chris@49: subview::operator()(const span& row_span, const uword col_num) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const bool row_all = row_span.whole; Chris@49: Chris@49: const uword local_n_rows = n_rows; Chris@49: Chris@49: const uword in_row1 = row_all ? 0 : row_span.a; Chris@49: const uword in_row2 = row_span.b; Chris@49: const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; Chris@49: Chris@49: const uword base_row1 = aux_row1 + in_row1; Chris@49: const uword base_col = aux_col1 + col_num; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: (col_num >= n_cols) Chris@49: || Chris@49: ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) Chris@49: , Chris@49: "subview::operator(): indices out of bounds or incorrectly used" Chris@49: ); Chris@49: Chris@49: return subview_col(m, base_col, base_row1, submat_n_rows); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! create a Col object which uses memory from an existing matrix object. Chris@49: //! this approach is currently not alias safe Chris@49: //! and does not take into account that the parent matrix object could be deleted. Chris@49: //! if deleted memory is accessed by the created Col object, Chris@49: //! it will cause memory corruption and/or a crash Chris@49: template Chris@49: inline Chris@49: Col Chris@49: subview::unsafe_col(const uword col_num) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( col_num >= n_cols, "subview::unsafe_col(): out of bounds"); Chris@49: Chris@49: return Col(colptr(col_num), n_rows, false, true); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! create a Col object which uses memory from an existing matrix object. Chris@49: //! this approach is currently not alias safe Chris@49: //! and does not take into account that the parent matrix object could be deleted. Chris@49: //! if deleted memory is accessed by the created Col object, Chris@49: //! it will cause memory corruption and/or a crash Chris@49: template Chris@49: inline Chris@49: const Col Chris@49: subview::unsafe_col(const uword col_num) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( col_num >= n_cols, "subview::unsafe_col(): out of bounds"); Chris@49: Chris@49: return Col(const_cast(colptr(col_num)), n_rows, false, true); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! creation of subview (submatrix comprised of specified row vectors) Chris@49: template Chris@49: inline Chris@49: subview Chris@49: subview::rows(const uword in_row1, const uword in_row2) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: (in_row1 > in_row2) || (in_row2 >= n_rows), Chris@49: "subview::rows(): indices out of bounds or incorrectly used" Chris@49: ); Chris@49: Chris@49: const uword subview_n_rows = in_row2 - in_row1 + 1; Chris@49: const uword base_row1 = aux_row1 + in_row1; Chris@49: Chris@49: return subview(m, base_row1, aux_col1, subview_n_rows, n_cols ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! creation of subview (submatrix comprised of specified row vectors) Chris@49: template Chris@49: inline Chris@49: const subview Chris@49: subview::rows(const uword in_row1, const uword in_row2) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: (in_row1 > in_row2) || (in_row2 >= n_rows), Chris@49: "subview::rows(): indices out of bounds or incorrectly used" Chris@49: ); Chris@49: Chris@49: const uword subview_n_rows = in_row2 - in_row1 + 1; Chris@49: const uword base_row1 = aux_row1 + in_row1; Chris@49: Chris@49: return subview(m, base_row1, aux_col1, subview_n_rows, n_cols ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! creation of subview (submatrix comprised of specified column vectors) Chris@49: template Chris@49: inline Chris@49: subview Chris@49: subview::cols(const uword in_col1, const uword in_col2) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: (in_col1 > in_col2) || (in_col2 >= n_cols), Chris@49: "subview::cols(): indices out of bounds or incorrectly used" Chris@49: ); Chris@49: Chris@49: const uword subview_n_cols = in_col2 - in_col1 + 1; Chris@49: const uword base_col1 = aux_col1 + in_col1; Chris@49: Chris@49: return subview(m, aux_row1, base_col1, n_rows, subview_n_cols); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! creation of subview (submatrix comprised of specified column vectors) Chris@49: template Chris@49: inline Chris@49: const subview Chris@49: subview::cols(const uword in_col1, const uword in_col2) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: (in_col1 > in_col2) || (in_col2 >= n_cols), Chris@49: "subview::cols(): indices out of bounds or incorrectly used" Chris@49: ); Chris@49: Chris@49: const uword subview_n_cols = in_col2 - in_col1 + 1; Chris@49: const uword base_col1 = aux_col1 + in_col1; Chris@49: Chris@49: return subview(m, aux_row1, base_col1, n_rows, subview_n_cols); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! creation of subview (submatrix) Chris@49: template Chris@49: inline Chris@49: subview Chris@49: subview::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols), Chris@49: "subview::submat(): indices out of bounds or incorrectly used" Chris@49: ); Chris@49: Chris@49: const uword subview_n_rows = in_row2 - in_row1 + 1; Chris@49: const uword subview_n_cols = in_col2 - in_col1 + 1; Chris@49: Chris@49: const uword base_row1 = aux_row1 + in_row1; Chris@49: const uword base_col1 = aux_col1 + in_col1; Chris@49: Chris@49: return subview(m, base_row1, base_col1, subview_n_rows, subview_n_cols); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! creation of subview (generic submatrix) Chris@49: template Chris@49: inline Chris@49: const subview Chris@49: subview::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols), Chris@49: "subview::submat(): indices out of bounds or incorrectly used" Chris@49: ); Chris@49: Chris@49: const uword subview_n_rows = in_row2 - in_row1 + 1; Chris@49: const uword subview_n_cols = in_col2 - in_col1 + 1; Chris@49: Chris@49: const uword base_row1 = aux_row1 + in_row1; Chris@49: const uword base_col1 = aux_col1 + in_col1; Chris@49: Chris@49: return subview(m, base_row1, base_col1, subview_n_rows, subview_n_cols); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! creation of subview (submatrix) Chris@49: template Chris@49: inline Chris@49: subview Chris@49: subview::submat(const span& row_span, const span& col_span) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const bool row_all = row_span.whole; Chris@49: const bool col_all = col_span.whole; Chris@49: Chris@49: const uword local_n_rows = n_rows; Chris@49: const uword local_n_cols = n_cols; Chris@49: Chris@49: const uword in_row1 = row_all ? 0 : row_span.a; Chris@49: const uword in_row2 = row_span.b; Chris@49: const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; Chris@49: Chris@49: const uword in_col1 = col_all ? 0 : col_span.a; Chris@49: const uword in_col2 = col_span.b; Chris@49: const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) Chris@49: || Chris@49: ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) Chris@49: , Chris@49: "subview::submat(): indices out of bounds or incorrectly used" Chris@49: ); Chris@49: Chris@49: const uword base_row1 = aux_row1 + in_row1; Chris@49: const uword base_col1 = aux_col1 + in_col1; Chris@49: Chris@49: return subview(m, base_row1, base_col1, submat_n_rows, submat_n_cols); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! creation of subview (generic submatrix) Chris@49: template Chris@49: inline Chris@49: const subview Chris@49: subview::submat(const span& row_span, const span& col_span) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const bool row_all = row_span.whole; Chris@49: const bool col_all = col_span.whole; Chris@49: Chris@49: const uword local_n_rows = n_rows; Chris@49: const uword local_n_cols = n_cols; Chris@49: Chris@49: const uword in_row1 = row_all ? 0 : row_span.a; Chris@49: const uword in_row2 = row_span.b; Chris@49: const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; Chris@49: Chris@49: const uword in_col1 = col_all ? 0 : col_span.a; Chris@49: const uword in_col2 = col_span.b; Chris@49: const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) Chris@49: || Chris@49: ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) Chris@49: , Chris@49: "subview::submat(): indices out of bounds or incorrectly used" Chris@49: ); Chris@49: Chris@49: const uword base_row1 = aux_row1 + in_row1; Chris@49: const uword base_col1 = aux_col1 + in_col1; Chris@49: Chris@49: return subview(m, base_row1, base_col1, submat_n_rows, submat_n_cols); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: subview Chris@49: subview::operator()(const span& row_span, const span& col_span) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return (*this).submat(row_span, col_span); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const subview Chris@49: subview::operator()(const span& row_span, const span& col_span) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return (*this).submat(row_span, col_span); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: subview_each1< subview, 0 > Chris@49: subview::each_col() Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return subview_each1< subview, 0 >(*this); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: subview_each1< subview, 1 > Chris@49: subview::each_row() Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return subview_each1< subview, 1 >(*this); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: subview_each2< subview, 0, T1 > Chris@49: subview::each_col(const Base& indices) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return subview_each2< subview, 0, T1 >(*this, indices); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: subview_each2< subview, 1, T1 > Chris@49: subview::each_row(const Base& indices) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return subview_each2< subview, 1, T1 >(*this, indices); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! creation of diagview (diagonal) Chris@49: template Chris@49: inline Chris@49: diagview Chris@49: subview::diag(const sword in_id) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const uword row_offset = (in_id < 0) ? uword(-in_id) : 0; Chris@49: const uword col_offset = (in_id > 0) ? uword( in_id) : 0; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)), Chris@49: "subview::diag(): requested diagonal out of bounds" Chris@49: ); Chris@49: Chris@49: const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset); Chris@49: Chris@49: const uword base_row_offset = aux_row1 + row_offset; Chris@49: const uword base_col_offset = aux_col1 + col_offset; Chris@49: Chris@49: return diagview(m, base_row_offset, base_col_offset, len); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! creation of diagview (diagonal) Chris@49: template Chris@49: inline Chris@49: const diagview Chris@49: subview::diag(const sword in_id) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const uword row_offset = (in_id < 0) ? -in_id : 0; Chris@49: const uword col_offset = (in_id > 0) ? in_id : 0; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)), Chris@49: "subview::diag(): requested diagonal out of bounds" Chris@49: ); Chris@49: Chris@49: const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset); Chris@49: Chris@49: const uword base_row_offset = aux_row1 + row_offset; Chris@49: const uword base_col_offset = aux_col1 + col_offset; Chris@49: Chris@49: return diagview(m, base_row_offset, base_col_offset, len); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::swap_rows(const uword in_row1, const uword in_row2) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: (in_row1 >= n_rows) || (in_row2 >= n_rows), Chris@49: "subview::swap_rows(): out of bounds" Chris@49: ); Chris@49: Chris@49: eT* mem = (const_cast< Mat& >(m)).memptr(); Chris@49: Chris@49: if(n_elem > 0) Chris@49: { Chris@49: const uword m_n_rows = m.n_rows; Chris@49: Chris@49: for(uword ucol=0; ucol < n_cols; ++ucol) Chris@49: { Chris@49: const uword offset = (aux_col1 + ucol) * m_n_rows; Chris@49: const uword pos1 = aux_row1 + in_row1 + offset; Chris@49: const uword pos2 = aux_row1 + in_row2 + offset; Chris@49: Chris@49: std::swap( access::rw(mem[pos1]), access::rw(mem[pos2]) ); Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview::swap_cols(const uword in_col1, const uword in_col2) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: (in_col1 >= n_cols) || (in_col2 >= n_cols), Chris@49: "subview::swap_cols(): out of bounds" Chris@49: ); Chris@49: Chris@49: if(n_elem > 0) Chris@49: { Chris@49: eT* ptr1 = colptr(in_col1); Chris@49: eT* ptr2 = colptr(in_col2); Chris@49: Chris@49: for(uword urow=0; urow < n_rows; ++urow) Chris@49: { Chris@49: std::swap( ptr1[urow], ptr2[urow] ); Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // template Chris@49: // inline Chris@49: // subview::iter::iter(const subview& S) Chris@49: // : mem (S.m.mem) Chris@49: // , n_rows (S.m.n_rows) Chris@49: // , row_start (S.aux_row1) Chris@49: // , row_end_p1(row_start + S.n_rows) Chris@49: // , row (row_start) Chris@49: // , col (S.aux_col1) Chris@49: // , i (row + col*n_rows) 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: // eT Chris@49: // subview::iter::operator*() const Chris@49: // { Chris@49: // return mem[i]; Chris@49: // } Chris@49: // Chris@49: // Chris@49: // Chris@49: // template Chris@49: // inline Chris@49: // void Chris@49: // subview::iter::operator++() Chris@49: // { Chris@49: // ++row; Chris@49: // Chris@49: // if(row < row_end_p1) Chris@49: // { Chris@49: // ++i; Chris@49: // } Chris@49: // else Chris@49: // { Chris@49: // row = row_start; Chris@49: // ++col; Chris@49: // Chris@49: // i = row + col*n_rows; Chris@49: // } Chris@49: // } Chris@49: // Chris@49: // Chris@49: // Chris@49: // template Chris@49: // inline Chris@49: // void Chris@49: // subview::iter::operator++(int) Chris@49: // { Chris@49: // operator++(); Chris@49: // } Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // Chris@49: // Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: subview_col::subview_col(const Mat& in_m, const uword in_col) Chris@49: : subview(in_m, 0, in_col, in_m.n_rows, 1) Chris@49: , colmem(subview::colptr(0)) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: subview_col::subview_col(const Mat& in_m, const uword in_col, const uword in_row1, const uword in_n_rows) Chris@49: : subview(in_m, in_row1, in_col, in_n_rows, 1) Chris@49: , colmem(subview::colptr(0)) 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_col::operator=(const subview& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: subview::operator=(X); Chris@49: Chris@49: access::rw(colmem) = subview::colptr(0); Chris@49: Chris@49: arma_debug_check( (subview::n_cols > 1), "subview_col(): incompatible dimensions" ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_col::operator=(const subview_col& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: subview::operator=(X); // interprets 'subview_col' as 'subview' Chris@49: Chris@49: access::rw(colmem) = subview::colptr(0); Chris@49: Chris@49: arma_debug_check( (subview::n_cols > 1), "subview_col(): incompatible dimensions" ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_col::operator=(const Base& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: subview::operator=(X); Chris@49: Chris@49: access::rw(colmem) = subview::colptr(0); Chris@49: Chris@49: arma_debug_check( (subview::n_cols > 1), "subview_col(): incompatible dimensions" ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const Op,op_htrans> Chris@49: subview_col::t() const Chris@49: { Chris@49: return Op,op_htrans>(*this); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const Op,op_htrans> Chris@49: subview_col::ht() const Chris@49: { Chris@49: return Op,op_htrans>(*this); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const Op,op_strans> Chris@49: subview_col::st() const Chris@49: { Chris@49: return Op,op_strans>(*this); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: eT Chris@49: subview_col::at_alt(const uword ii) const Chris@49: { Chris@49: const eT* colmem_aligned = colmem; Chris@49: memory::mark_as_aligned(colmem_aligned); Chris@49: Chris@49: return colmem_aligned[ii]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: eT& Chris@49: subview_col::operator[](const uword ii) Chris@49: { Chris@49: return access::rw( colmem[ii] ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: eT Chris@49: subview_col::operator[](const uword ii) const Chris@49: { Chris@49: return colmem[ii]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT& Chris@49: subview_col::operator()(const uword ii) Chris@49: { Chris@49: arma_debug_check( (ii >= subview::n_elem), "subview::operator(): index out of bounds"); Chris@49: Chris@49: return access::rw( colmem[ii] ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT Chris@49: subview_col::operator()(const uword ii) const Chris@49: { Chris@49: arma_debug_check( (ii >= subview::n_elem), "subview::operator(): index out of bounds"); Chris@49: Chris@49: return colmem[ii]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT& Chris@49: subview_col::operator()(const uword in_row, const uword in_col) Chris@49: { Chris@49: arma_debug_check( ((in_row >= subview::n_rows) || (in_col > 0)), "subview::operator(): index out of bounds"); Chris@49: Chris@49: return access::rw( colmem[in_row] ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT Chris@49: subview_col::operator()(const uword in_row, const uword in_col) const Chris@49: { Chris@49: arma_debug_check( ((in_row >= subview::n_rows) || (in_col > 0)), "subview::operator(): index out of bounds"); Chris@49: Chris@49: return colmem[in_row]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT& Chris@49: subview_col::at(const uword in_row, const uword) Chris@49: { Chris@49: return access::rw( colmem[in_row] ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT Chris@49: subview_col::at(const uword in_row, const uword) const Chris@49: { Chris@49: return colmem[in_row]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: eT* Chris@49: subview_col::colptr(const uword) Chris@49: { Chris@49: return const_cast(colmem); Chris@49: } Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const eT* Chris@49: subview_col::colptr(const uword) const Chris@49: { Chris@49: return colmem; Chris@49: } Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: subview_col Chris@49: subview_col::rows(const uword in_row1, const uword in_row2) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= subview::n_rows) ), "subview_col::rows(): indices out of bounds or incorrectly used"); Chris@49: Chris@49: const uword subview_n_rows = in_row2 - in_row1 + 1; Chris@49: Chris@49: const uword base_row1 = this->aux_row1 + in_row1; Chris@49: Chris@49: return subview_col(this->m, this->aux_col1, base_row1, subview_n_rows); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const subview_col Chris@49: subview_col::rows(const uword in_row1, const uword in_row2) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= subview::n_rows) ), "subview_col::rows(): indices out of bounds or incorrectly used"); Chris@49: Chris@49: const uword subview_n_rows = in_row2 - in_row1 + 1; Chris@49: Chris@49: const uword base_row1 = this->aux_row1 + in_row1; Chris@49: Chris@49: return subview_col(this->m, this->aux_col1, base_row1, subview_n_rows); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: subview_col Chris@49: subview_col::subvec(const uword in_row1, const uword in_row2) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= subview::n_rows) ), "subview_col::subvec(): indices out of bounds or incorrectly used"); Chris@49: Chris@49: const uword subview_n_rows = in_row2 - in_row1 + 1; Chris@49: Chris@49: const uword base_row1 = this->aux_row1 + in_row1; Chris@49: Chris@49: return subview_col(this->m, this->aux_col1, base_row1, subview_n_rows); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const subview_col Chris@49: subview_col::subvec(const uword in_row1, const uword in_row2) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= subview::n_rows) ), "subview_col::subvec(): indices out of bounds or incorrectly used"); Chris@49: Chris@49: const uword subview_n_rows = in_row2 - in_row1 + 1; Chris@49: Chris@49: const uword base_row1 = this->aux_row1 + in_row1; Chris@49: Chris@49: return subview_col(this->m, this->aux_col1, base_row1, subview_n_rows); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // Chris@49: // Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: subview_row::subview_row(const Mat& in_m, const uword in_row) Chris@49: : subview(in_m, in_row, 0, 1, in_m.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: subview_row::subview_row(const Mat& in_m, const uword in_row, const uword in_col1, const uword in_n_cols) Chris@49: : subview(in_m, in_row, in_col1, 1, 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_row::operator=(const subview& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: subview::operator=(X); Chris@49: arma_debug_check( (subview::n_rows > 1), "subview_row(): incompatible dimensions" ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_row::operator=(const subview_row& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: subview::operator=(X); // interprets 'subview_row' as 'subview' Chris@49: arma_debug_check( (subview::n_rows > 1), "subview_row(): incompatible dimensions" ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_row::operator=(const Base& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: subview::operator=(X); Chris@49: arma_debug_check( (subview::n_rows > 1), "subview_row(): incompatible dimensions" ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const Op,op_htrans> Chris@49: subview_row::t() const Chris@49: { Chris@49: return Op,op_htrans>(*this); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const Op,op_htrans> Chris@49: subview_row::ht() const Chris@49: { Chris@49: return Op,op_htrans>(*this); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const Op,op_strans> Chris@49: subview_row::st() const Chris@49: { Chris@49: return Op,op_strans>(*this); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT Chris@49: subview_row::at_alt(const uword ii) const Chris@49: { Chris@49: const uword index = (ii + (subview::aux_col1))*(subview::m).n_rows + (subview::aux_row1); Chris@49: Chris@49: return subview::m.mem[index]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT& Chris@49: subview_row::operator[](const uword ii) Chris@49: { Chris@49: const uword index = (ii + (subview::aux_col1))*(subview::m).n_rows + (subview::aux_row1); Chris@49: Chris@49: return access::rw( (const_cast< Mat& >(subview::m)).mem[index] ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT Chris@49: subview_row::operator[](const uword ii) const Chris@49: { Chris@49: const uword index = (ii + (subview::aux_col1))*(subview::m).n_rows + (subview::aux_row1); Chris@49: Chris@49: return subview::m.mem[index]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT& Chris@49: subview_row::operator()(const uword ii) Chris@49: { Chris@49: arma_debug_check( (ii >= subview::n_elem), "subview::operator(): index out of bounds"); Chris@49: Chris@49: const uword index = (ii + (subview::aux_col1))*(subview::m).n_rows + (subview::aux_row1); Chris@49: Chris@49: return access::rw( (const_cast< Mat& >(subview::m)).mem[index] ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT Chris@49: subview_row::operator()(const uword ii) const Chris@49: { Chris@49: arma_debug_check( (ii >= subview::n_elem), "subview::operator(): index out of bounds"); Chris@49: Chris@49: const uword index = (ii + (subview::aux_col1))*(subview::m).n_rows + (subview::aux_row1); Chris@49: Chris@49: return subview::m.mem[index]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT& Chris@49: subview_row::operator()(const uword in_row, const uword in_col) Chris@49: { Chris@49: arma_debug_check( ((in_row > 0) || (in_col >= subview::n_cols)), "subview::operator(): index out of bounds"); Chris@49: Chris@49: const uword index = (in_col + (subview::aux_col1))*(subview::m).n_rows + (subview::aux_row1); Chris@49: Chris@49: return access::rw( (const_cast< Mat& >(subview::m)).mem[index] ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT Chris@49: subview_row::operator()(const uword in_row, const uword in_col) const Chris@49: { Chris@49: arma_debug_check( ((in_row > 0) || (in_col >= subview::n_cols)), "subview::operator(): index out of bounds"); Chris@49: Chris@49: const uword index = (in_col + (subview::aux_col1))*(subview::m).n_rows + (subview::aux_row1); Chris@49: Chris@49: return subview::m.mem[index]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT& Chris@49: subview_row::at(const uword, const uword in_col) Chris@49: { Chris@49: const uword index = (in_col + (subview::aux_col1))*(subview::m).n_rows + (subview::aux_row1); Chris@49: Chris@49: return access::rw( (const_cast< Mat& >(subview::m)).mem[index] ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT Chris@49: subview_row::at(const uword, const uword in_col) const Chris@49: { Chris@49: const uword index = (in_col + (subview::aux_col1))*(subview::m).n_rows + (subview::aux_row1); Chris@49: Chris@49: return subview::m.mem[index]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: subview_row Chris@49: subview_row::cols(const uword in_col1, const uword in_col2) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= subview::n_cols) ), "subview_row::cols(): indices out of bounds or incorrectly used" ); Chris@49: Chris@49: const uword subview_n_cols = in_col2 - in_col1 + 1; Chris@49: Chris@49: const uword base_col1 = this->aux_col1 + in_col1; Chris@49: Chris@49: return subview_row(this->m, this->aux_row1, base_col1, subview_n_cols); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const subview_row Chris@49: subview_row::cols(const uword in_col1, const uword in_col2) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= subview::n_cols) ), "subview_row::cols(): indices out of bounds or incorrectly used"); Chris@49: Chris@49: const uword subview_n_cols = in_col2 - in_col1 + 1; Chris@49: Chris@49: const uword base_col1 = this->aux_col1 + in_col1; Chris@49: Chris@49: return subview_row(this->m, this->aux_row1, base_col1, subview_n_cols); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: subview_row Chris@49: subview_row::subvec(const uword in_col1, const uword in_col2) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= subview::n_cols) ), "subview_row::subvec(): indices out of bounds or incorrectly used"); Chris@49: Chris@49: const uword subview_n_cols = in_col2 - in_col1 + 1; Chris@49: Chris@49: const uword base_col1 = this->aux_col1 + in_col1; Chris@49: Chris@49: return subview_row(this->m, this->aux_row1, base_col1, subview_n_cols); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const subview_row Chris@49: subview_row::subvec(const uword in_col1, const uword in_col2) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= subview::n_cols) ), "subview_row::subvec(): indices out of bounds or incorrectly used"); Chris@49: Chris@49: const uword subview_n_cols = in_col2 - in_col1 + 1; Chris@49: Chris@49: const uword base_col1 = this->aux_col1 + in_col1; Chris@49: Chris@49: return subview_row(this->m, this->aux_row1, base_col1, subview_n_cols); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // Chris@49: // Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: subview_row_strans::subview_row_strans(const subview_row& in_sv_row) Chris@49: : sv_row(in_sv_row ) Chris@49: , n_rows(in_sv_row.n_cols) Chris@49: , n_elem(in_sv_row.n_elem) 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_row_strans::extract(Mat& out) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: // NOTE: this function assumes that matrix 'out' has already been set to the correct size Chris@49: Chris@49: const Mat& X = sv_row.m; Chris@49: Chris@49: eT* out_mem = out.memptr(); Chris@49: Chris@49: const uword row = sv_row.aux_row1; Chris@49: const uword start_col = sv_row.aux_col1; Chris@49: const uword sv_row_n_cols = sv_row.n_cols; Chris@49: Chris@49: uword ii,jj; Chris@49: Chris@49: for(ii=0, jj=1; jj < sv_row_n_cols; ii+=2, jj+=2) Chris@49: { Chris@49: const eT tmp1 = X.at(row, start_col+ii); Chris@49: const eT tmp2 = X.at(row, start_col+jj); Chris@49: Chris@49: out_mem[ii] = tmp1; Chris@49: out_mem[jj] = tmp2; Chris@49: } Chris@49: Chris@49: if(ii < sv_row_n_cols) Chris@49: { Chris@49: out_mem[ii] = X.at(row, start_col+ii); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT Chris@49: subview_row_strans::at_alt(const uword ii) const Chris@49: { Chris@49: return sv_row[ii]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT Chris@49: subview_row_strans::operator[](const uword ii) const Chris@49: { Chris@49: return sv_row[ii]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT Chris@49: subview_row_strans::operator()(const uword ii) const Chris@49: { Chris@49: return sv_row(ii); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT Chris@49: subview_row_strans::operator()(const uword in_row, const uword in_col) const Chris@49: { Chris@49: return sv_row(in_col, in_row); // deliberately swapped Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT Chris@49: subview_row_strans::at(const uword in_row, const uword) const Chris@49: { Chris@49: return sv_row.at(0, in_row); // deliberately swapped Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // Chris@49: // Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: subview_row_htrans::subview_row_htrans(const subview_row& in_sv_row) Chris@49: : sv_row(in_sv_row ) Chris@49: , n_rows(in_sv_row.n_cols) Chris@49: , n_elem(in_sv_row.n_elem) 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_row_htrans::extract(Mat& out) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: // NOTE: this function assumes that matrix 'out' has already been set to the correct size Chris@49: Chris@49: const Mat& X = sv_row.m; Chris@49: Chris@49: eT* out_mem = out.memptr(); Chris@49: Chris@49: const uword row = sv_row.aux_row1; Chris@49: const uword start_col = sv_row.aux_col1; Chris@49: const uword sv_row_n_cols = sv_row.n_cols; Chris@49: Chris@49: for(uword ii=0; ii < sv_row_n_cols; ++ii) Chris@49: { Chris@49: out_mem[ii] = access::alt_conj( X.at(row, start_col+ii) ); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT Chris@49: subview_row_htrans::at_alt(const uword ii) const Chris@49: { Chris@49: return access::alt_conj( sv_row[ii] ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT Chris@49: subview_row_htrans::operator[](const uword ii) const Chris@49: { Chris@49: return access::alt_conj( sv_row[ii] ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT Chris@49: subview_row_htrans::operator()(const uword ii) const Chris@49: { Chris@49: return access::alt_conj( sv_row(ii) ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT Chris@49: subview_row_htrans::operator()(const uword in_row, const uword in_col) const Chris@49: { Chris@49: return access::alt_conj( sv_row(in_col, in_row) ); // deliberately swapped Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: eT Chris@49: subview_row_htrans::at(const uword in_row, const uword) const Chris@49: { Chris@49: return access::alt_conj( sv_row.at(0, in_row) ); // deliberately swapped Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! @}