Chris@49: // Copyright (C) 2010-2013 NICTA (www.nicta.com.au) Chris@49: // Copyright (C) 2010-2013 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_elem1 Chris@49: //! @{ Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: subview_elem1::~subview_elem1() Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: subview_elem1::subview_elem1(const Mat& in_m, const Base& in_a) Chris@49: : m(in_m) Chris@49: , a(in_a) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem1::inplace_op(const eT val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Mat& m_local = const_cast< Mat& >(m); Chris@49: Chris@49: eT* m_mem = m_local.memptr(); Chris@49: const uword m_n_elem = m_local.n_elem; Chris@49: Chris@49: const unwrap_check_mixed tmp(a.get_ref(), m_local); Chris@49: const umat& aa = tmp.M; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: ( (aa.is_vec() == false) && (aa.is_empty() == false) ), Chris@49: "Mat::elem(): given object is not a vector" Chris@49: ); Chris@49: Chris@49: const uword* aa_mem = aa.memptr(); Chris@49: const uword aa_n_elem = aa.n_elem; Chris@49: Chris@49: uword iq,jq; Chris@49: for(iq=0, jq=1; jq < aa_n_elem; iq+=2, jq+=2) Chris@49: { Chris@49: const uword ii = aa_mem[iq]; Chris@49: const uword jj = aa_mem[jq]; Chris@49: Chris@49: arma_debug_check( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), "Mat::elem(): index out of bounds" ); Chris@49: Chris@49: if(is_same_type::value == true) { m_mem[ii] = val; m_mem[jj] = val; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] += val; m_mem[jj] += val; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] -= val; m_mem[jj] -= val; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] *= val; m_mem[jj] *= val; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] /= val; m_mem[jj] /= val; } Chris@49: } Chris@49: Chris@49: if(iq < aa_n_elem) Chris@49: { Chris@49: const uword ii = aa_mem[iq]; Chris@49: Chris@49: arma_debug_check( (ii >= m_n_elem) , "Mat::elem(): index out of bounds" ); Chris@49: Chris@49: if(is_same_type::value == true) { m_mem[ii] = val; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] += val; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] -= val; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] *= val; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] /= val; } 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_elem1::inplace_op(const subview_elem1& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: subview_elem1& s = *this; Chris@49: Chris@49: if(&(s.m) == &(x.m)) Chris@49: { Chris@49: arma_extra_debug_print("subview_elem1::inplace_op(): aliasing detected"); Chris@49: Chris@49: const Mat tmp(x); Chris@49: Chris@49: if(is_same_type::value == true) { s.operator= (tmp); } Chris@49: else if(is_same_type::value == true) { s.operator+=(tmp); } Chris@49: else if(is_same_type::value == true) { s.operator-=(tmp); } Chris@49: else if(is_same_type::value == true) { s.operator%=(tmp); } Chris@49: else if(is_same_type::value == true) { s.operator/=(tmp); } Chris@49: } Chris@49: else Chris@49: { Chris@49: Mat& s_m_local = const_cast< Mat& >(s.m); Chris@49: const Mat& x_m_local = x.m; Chris@49: Chris@49: const unwrap_check_mixed s_tmp(s.a.get_ref(), s_m_local); Chris@49: const unwrap_check_mixed x_tmp(x.a.get_ref(), s_m_local); Chris@49: Chris@49: const umat& s_aa = s_tmp.M; Chris@49: const umat& x_aa = x_tmp.M; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: ( ((s_aa.is_vec() == false) && (s_aa.is_empty() == false)) || ((x_aa.is_vec() == false) && (x_aa.is_empty() == false)) ), Chris@49: "Mat::elem(): given object is not a vector" Chris@49: ); Chris@49: Chris@49: const uword* s_aa_mem = s_aa.memptr(); Chris@49: const uword* x_aa_mem = x_aa.memptr(); Chris@49: Chris@49: const uword s_aa_n_elem = s_aa.n_elem; Chris@49: Chris@49: arma_debug_check( (s_aa_n_elem != x_aa.n_elem), "Mat::elem(): size mismatch" ); Chris@49: Chris@49: Chris@49: eT* s_m_mem = s_m_local.memptr(); Chris@49: const uword s_m_n_elem = s_m_local.n_elem; Chris@49: Chris@49: const eT* x_m_mem = x_m_local.memptr(); Chris@49: const uword x_m_n_elem = x_m_local.n_elem; Chris@49: Chris@49: uword iq,jq; Chris@49: for(iq=0, jq=1; jq < s_aa_n_elem; iq+=2, jq+=2) Chris@49: { Chris@49: const uword s_ii = s_aa_mem[iq]; Chris@49: const uword s_jj = s_aa_mem[jq]; Chris@49: Chris@49: const uword x_ii = x_aa_mem[iq]; Chris@49: const uword x_jj = x_aa_mem[jq]; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: (s_ii >= s_m_n_elem) || (s_jj >= s_m_n_elem) || (x_ii >= x_m_n_elem) || (x_jj >= x_m_n_elem), Chris@49: "Mat::elem(): index out of bounds" Chris@49: ); Chris@49: Chris@49: if(is_same_type::value == true) { s_m_mem[s_ii] = x_m_mem[x_ii]; s_m_mem[s_jj] = x_m_mem[x_jj]; } Chris@49: else if(is_same_type::value == true) { s_m_mem[s_ii] += x_m_mem[x_ii]; s_m_mem[s_jj] += x_m_mem[x_jj]; } Chris@49: else if(is_same_type::value == true) { s_m_mem[s_ii] -= x_m_mem[x_ii]; s_m_mem[s_jj] -= x_m_mem[x_jj]; } Chris@49: else if(is_same_type::value == true) { s_m_mem[s_ii] *= x_m_mem[x_ii]; s_m_mem[s_jj] *= x_m_mem[x_jj]; } Chris@49: else if(is_same_type::value == true) { s_m_mem[s_ii] /= x_m_mem[x_ii]; s_m_mem[s_jj] /= x_m_mem[x_jj]; } Chris@49: } Chris@49: Chris@49: if(iq < s_aa_n_elem) Chris@49: { Chris@49: const uword s_ii = s_aa_mem[iq]; Chris@49: const uword x_ii = x_aa_mem[iq]; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: ( (s_ii >= s_m_n_elem) || (x_ii >= x_m_n_elem) ), Chris@49: "Mat::elem(): index out of bounds" Chris@49: ); Chris@49: Chris@49: if(is_same_type::value == true) { s_m_mem[s_ii] = x_m_mem[x_ii]; } Chris@49: else if(is_same_type::value == true) { s_m_mem[s_ii] += x_m_mem[x_ii]; } Chris@49: else if(is_same_type::value == true) { s_m_mem[s_ii] -= x_m_mem[x_ii]; } Chris@49: else if(is_same_type::value == true) { s_m_mem[s_ii] *= x_m_mem[x_ii]; } Chris@49: else if(is_same_type::value == true) { s_m_mem[s_ii] /= x_m_mem[x_ii]; } 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_elem1::inplace_op(const Base& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Mat& m_local = const_cast< Mat& >(m); Chris@49: Chris@49: eT* m_mem = m_local.memptr(); Chris@49: const uword m_n_elem = m_local.n_elem; Chris@49: Chris@49: const unwrap_check_mixed aa_tmp(a.get_ref(), m_local); Chris@49: const umat& aa = aa_tmp.M; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: ( (aa.is_vec() == false) && (aa.is_empty() == false) ), Chris@49: "Mat::elem(): given object is not a vector" Chris@49: ); Chris@49: Chris@49: const uword* aa_mem = aa.memptr(); Chris@49: const uword aa_n_elem = aa.n_elem; Chris@49: Chris@49: const Proxy P(x.get_ref()); Chris@49: Chris@49: arma_debug_check( (aa_n_elem != P.get_n_elem()), "Mat::elem(): size mismatch" ); Chris@49: Chris@49: const bool is_alias = P.is_alias(m); Chris@49: Chris@49: if( (is_alias == false) && (Proxy::prefer_at_accessor == false) ) Chris@49: { Chris@49: typename Proxy::ea_type X = P.get_ea(); Chris@49: Chris@49: uword iq,jq; Chris@49: for(iq=0, jq=1; jq < aa_n_elem; iq+=2, jq+=2) Chris@49: { Chris@49: const uword ii = aa_mem[iq]; Chris@49: const uword jj = aa_mem[jq]; Chris@49: Chris@49: arma_debug_check( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), "Mat::elem(): index out of bounds" ); Chris@49: Chris@49: if(is_same_type::value == true) { m_mem[ii] = X[iq]; m_mem[jj] = X[jq]; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] += X[iq]; m_mem[jj] += X[jq]; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] -= X[iq]; m_mem[jj] -= X[jq]; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] *= X[iq]; m_mem[jj] *= X[jq]; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] /= X[iq]; m_mem[jj] /= X[jq]; } Chris@49: } Chris@49: Chris@49: if(iq < aa_n_elem) Chris@49: { Chris@49: const uword ii = aa_mem[iq]; Chris@49: Chris@49: arma_debug_check( (ii >= m_n_elem) , "Mat::elem(): index out of bounds" ); Chris@49: Chris@49: if(is_same_type::value == true) { m_mem[ii] = X[iq]; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] += X[iq]; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] -= X[iq]; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] *= X[iq]; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] /= X[iq]; } Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: arma_extra_debug_print("subview_elem1::inplace_op(): aliasing or prefer_at_accessor detected"); Chris@49: Chris@49: const unwrap_check::stored_type> tmp(P.Q, is_alias); Chris@49: const Mat& M = tmp.M; Chris@49: Chris@49: const eT* X = M.memptr(); Chris@49: Chris@49: uword iq,jq; Chris@49: for(iq=0, jq=1; jq < aa_n_elem; iq+=2, jq+=2) Chris@49: { Chris@49: const uword ii = aa_mem[iq]; Chris@49: const uword jj = aa_mem[jq]; Chris@49: Chris@49: arma_debug_check( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), "Mat::elem(): index out of bounds" ); Chris@49: Chris@49: if(is_same_type::value == true) { m_mem[ii] = X[iq]; m_mem[jj] = X[jq]; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] += X[iq]; m_mem[jj] += X[jq]; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] -= X[iq]; m_mem[jj] -= X[jq]; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] *= X[iq]; m_mem[jj] *= X[jq]; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] /= X[iq]; m_mem[jj] /= X[jq]; } Chris@49: } Chris@49: Chris@49: if(iq < aa_n_elem) Chris@49: { Chris@49: const uword ii = aa_mem[iq]; Chris@49: Chris@49: arma_debug_check( (ii >= m_n_elem) , "Mat::elem(): index out of bounds" ); Chris@49: Chris@49: if(is_same_type::value == true) { m_mem[ii] = X[iq]; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] += X[iq]; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] -= X[iq]; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] *= X[iq]; } Chris@49: else if(is_same_type::value == true) { m_mem[ii] /= X[iq]; } Chris@49: } 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: arma_inline Chris@49: const Op,op_htrans> Chris@49: subview_elem1::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_elem1::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_elem1::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: void Chris@49: subview_elem1::fill(const eT val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: inplace_op(val); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem1::zeros() Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: inplace_op(eT(0)); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem1::ones() Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: inplace_op(eT(1)); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem1::operator+= (const eT val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: inplace_op(val); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem1::operator-= (const eT val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: inplace_op(val); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem1::operator*= (const eT val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: inplace_op(val); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem1::operator/= (const eT val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: inplace_op(val); Chris@49: } 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_elem1::operator_equ(const subview_elem1& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: inplace_op(x); 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_elem1::operator= (const subview_elem1& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: (*this).operator_equ(x); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! work around compiler bugs Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem1::operator= (const subview_elem1& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: (*this).operator_equ(x); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem1::operator+= (const subview_elem1& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: inplace_op(x); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem1::operator-= (const subview_elem1& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: inplace_op(x); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem1::operator%= (const subview_elem1& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: inplace_op(x); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem1::operator/= (const subview_elem1& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: inplace_op(x); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem1::operator= (const Base& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: inplace_op(x); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem1::operator+= (const Base& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: inplace_op(x); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem1::operator-= (const Base& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: inplace_op(x); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem1::operator%= (const Base& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: inplace_op(x); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem1::operator/= (const Base& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: inplace_op(x); 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: void Chris@49: subview_elem1::extract(Mat& actual_out, const subview_elem1& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const unwrap_check_mixed tmp1(in.a.get_ref(), actual_out); Chris@49: const umat& aa = tmp1.M; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: ( (aa.is_vec() == false) && (aa.is_empty() == false) ), Chris@49: "Mat::elem(): given object is not a vector" Chris@49: ); Chris@49: Chris@49: const uword* aa_mem = aa.memptr(); Chris@49: const uword aa_n_elem = aa.n_elem; Chris@49: Chris@49: const Mat& m_local = in.m; Chris@49: Chris@49: const eT* m_mem = m_local.memptr(); Chris@49: const uword m_n_elem = m_local.n_elem; Chris@49: Chris@49: const bool alias = (&actual_out == &m_local); Chris@49: Chris@49: arma_extra_debug_warn(alias, "subview_elem1::extract(): aliasing detected"); Chris@49: Chris@49: Mat* tmp_out = alias ? new Mat() : 0; Chris@49: Mat& out = alias ? *tmp_out : actual_out; Chris@49: Chris@49: out.set_size(aa_n_elem, 1); Chris@49: Chris@49: eT* out_mem = out.memptr(); Chris@49: Chris@49: uword i,j; Chris@49: for(i=0, j=1; j= m_n_elem) || (jj >= m_n_elem) ), "Mat::elem(): index out of bounds" ); Chris@49: Chris@49: out_mem[i] = m_mem[ii]; Chris@49: out_mem[j] = m_mem[jj]; Chris@49: } Chris@49: Chris@49: if(i < aa_n_elem) Chris@49: { Chris@49: const uword ii = aa_mem[i]; Chris@49: Chris@49: arma_debug_check( (ii >= m_n_elem) , "Mat::elem(): index out of bounds" ); Chris@49: Chris@49: out_mem[i] = m_mem[ii]; Chris@49: } Chris@49: Chris@49: if(alias == true) Chris@49: { Chris@49: actual_out.steal_mem(out); Chris@49: delete tmp_out; 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_elem1::mat_inplace_op(Mat& out, const subview_elem1& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const unwrap tmp1(in.a.get_ref()); Chris@49: const umat& aa = tmp1.M; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: ( (aa.is_vec() == false) && (aa.is_empty() == false) ), Chris@49: "Mat::elem(): given object is not a vector" Chris@49: ); Chris@49: Chris@49: const uword* aa_mem = aa.memptr(); Chris@49: const uword aa_n_elem = aa.n_elem; Chris@49: Chris@49: const unwrap_check< Mat > tmp2(in.m, out); Chris@49: const Mat& m_local = tmp2.M; Chris@49: Chris@49: const eT* m_mem = m_local.memptr(); Chris@49: const uword m_n_elem = m_local.n_elem; Chris@49: Chris@49: arma_debug_check( (out.n_elem != aa_n_elem), "Mat::elem(): size mismatch" ); Chris@49: Chris@49: eT* out_mem = out.memptr(); Chris@49: Chris@49: uword i,j; Chris@49: for(i=0, j=1; j= m_n_elem) || (jj >= m_n_elem) ), "Mat::elem(): index out of bounds" ); Chris@49: Chris@49: if(is_same_type::value == true) { out_mem[i] += m_mem[ii]; out_mem[j] += m_mem[jj]; } Chris@49: else if(is_same_type::value == true) { out_mem[i] -= m_mem[ii]; out_mem[j] -= m_mem[jj]; } Chris@49: else if(is_same_type::value == true) { out_mem[i] *= m_mem[ii]; out_mem[j] *= m_mem[jj]; } Chris@49: else if(is_same_type::value == true) { out_mem[i] /= m_mem[ii]; out_mem[j] /= m_mem[jj]; } Chris@49: } Chris@49: Chris@49: if(i < aa_n_elem) Chris@49: { Chris@49: const uword ii = aa_mem[i]; Chris@49: Chris@49: arma_debug_check( (ii >= m_n_elem) , "Mat::elem(): index out of bounds" ); Chris@49: Chris@49: if(is_same_type::value == true) { out_mem[i] += m_mem[ii]; } Chris@49: else if(is_same_type::value == true) { out_mem[i] -= m_mem[ii]; } Chris@49: else if(is_same_type::value == true) { out_mem[i] *= m_mem[ii]; } Chris@49: else if(is_same_type::value == true) { out_mem[i] /= m_mem[ii]; } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem1::plus_inplace(Mat& out, const subview_elem1& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: mat_inplace_op(out, in); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem1::minus_inplace(Mat& out, const subview_elem1& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: mat_inplace_op(out, in); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem1::schur_inplace(Mat& out, const subview_elem1& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: mat_inplace_op(out, in); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem1::div_inplace(Mat& out, const subview_elem1& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: mat_inplace_op(out, in); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! @}