Chris@49: // Copyright (C) 2012-2013 NICTA (www.nicta.com.au) Chris@49: // Copyright (C) 2012-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_elem2 Chris@49: //! @{ Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: subview_elem2::~subview_elem2() Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: subview_elem2::subview_elem2 Chris@49: ( Chris@49: const Mat& in_m, Chris@49: const Base& in_ri, Chris@49: const Base& in_ci, Chris@49: const bool in_all_rows, Chris@49: const bool in_all_cols Chris@49: ) Chris@49: : m (in_m ) Chris@49: , base_ri (in_ri ) Chris@49: , base_ci (in_ci ) Chris@49: , all_rows (in_all_rows) Chris@49: , all_cols (in_all_cols) 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_elem2::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: const uword m_n_rows = m_local.n_rows; Chris@49: const uword m_n_cols = m_local.n_cols; Chris@49: Chris@49: if( (all_rows == false) && (all_cols == false) ) Chris@49: { Chris@49: const unwrap_check_mixed tmp1(base_ri.get_ref(), m_local); Chris@49: const unwrap_check_mixed tmp2(base_ci.get_ref(), m_local); Chris@49: Chris@49: const umat& ri = tmp1.M; Chris@49: const umat& ci = tmp2.M; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: ( ((ri.is_vec() == false) && (ri.is_empty() == false)) || ((ci.is_vec() == false) && (ci.is_empty() == false)) ), Chris@49: "Mat::elem(): given object is not a vector" Chris@49: ); Chris@49: Chris@49: const uword* ri_mem = ri.memptr(); Chris@49: const uword ri_n_elem = ri.n_elem; Chris@49: Chris@49: const uword* ci_mem = ci.memptr(); Chris@49: const uword ci_n_elem = ci.n_elem; Chris@49: Chris@49: for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count) Chris@49: { Chris@49: const uword col = ci_mem[ci_count]; Chris@49: Chris@49: arma_debug_check( (col > m_n_cols), "Mat::elem(): index out of bounds" ); Chris@49: Chris@49: for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count) Chris@49: { Chris@49: const uword row = ri_mem[ri_count]; Chris@49: Chris@49: arma_debug_check( (row > m_n_rows), "Mat::elem(): index out of bounds" ); Chris@49: Chris@49: if(is_same_type::value == true) { m_local.at(row,col) = val; } Chris@49: else if(is_same_type::value == true) { m_local.at(row,col) += val; } Chris@49: else if(is_same_type::value == true) { m_local.at(row,col) -= val; } Chris@49: else if(is_same_type::value == true) { m_local.at(row,col) *= val; } Chris@49: else if(is_same_type::value == true) { m_local.at(row,col) /= val; } Chris@49: } Chris@49: } Chris@49: } Chris@49: else Chris@49: if( (all_rows == true) && (all_cols == false) ) Chris@49: { Chris@49: const unwrap_check_mixed tmp2(base_ci.get_ref(), m_local); Chris@49: Chris@49: const umat& ci = tmp2.M; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: ( (ci.is_vec() == false) && (ci.is_empty() == false) ), Chris@49: "Mat::elem(): given object is not a vector" Chris@49: ); Chris@49: Chris@49: const uword* ci_mem = ci.memptr(); Chris@49: const uword ci_n_elem = ci.n_elem; Chris@49: Chris@49: for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count) Chris@49: { Chris@49: const uword col = ci_mem[ci_count]; Chris@49: Chris@49: arma_debug_check( (col > m_n_cols), "Mat::elem(): index out of bounds" ); Chris@49: Chris@49: eT* colptr = m_local.colptr(col); Chris@49: Chris@49: if(is_same_type::value == true) { arrayops::inplace_set (colptr, val, m_n_rows); } Chris@49: else if(is_same_type::value == true) { arrayops::inplace_plus (colptr, val, m_n_rows); } Chris@49: else if(is_same_type::value == true) { arrayops::inplace_minus(colptr, val, m_n_rows); } Chris@49: else if(is_same_type::value == true) { arrayops::inplace_mul (colptr, val, m_n_rows); } Chris@49: else if(is_same_type::value == true) { arrayops::inplace_div (colptr, val, m_n_rows); } Chris@49: } Chris@49: } Chris@49: else Chris@49: if( (all_rows == false) && (all_cols == true) ) Chris@49: { Chris@49: const unwrap_check_mixed tmp1(base_ri.get_ref(), m_local); Chris@49: Chris@49: const umat& ri = tmp1.M; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: ( (ri.is_vec() == false) && (ri.is_empty() == false) ), Chris@49: "Mat::elem(): given object is not a vector" Chris@49: ); Chris@49: Chris@49: const uword* ri_mem = ri.memptr(); Chris@49: const uword ri_n_elem = ri.n_elem; Chris@49: Chris@49: for(uword col=0; col < m_n_cols; ++col) Chris@49: { Chris@49: for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count) Chris@49: { Chris@49: const uword row = ri_mem[ri_count]; Chris@49: Chris@49: arma_debug_check( (row > m_n_rows), "Mat::elem(): index out of bounds" ); Chris@49: Chris@49: if(is_same_type::value == true) { m_local.at(row,col) = val; } Chris@49: else if(is_same_type::value == true) { m_local.at(row,col) += val; } Chris@49: else if(is_same_type::value == true) { m_local.at(row,col) -= val; } Chris@49: else if(is_same_type::value == true) { m_local.at(row,col) *= val; } Chris@49: else if(is_same_type::value == true) { m_local.at(row,col) /= val; } 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_elem2::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: const uword m_n_rows = m_local.n_rows; Chris@49: const uword m_n_cols = m_local.n_cols; Chris@49: Chris@49: const unwrap_check tmp(x.get_ref(), m_local); Chris@49: const Mat& X = tmp.M; Chris@49: Chris@49: if( (all_rows == false) && (all_cols == false) ) Chris@49: { Chris@49: const unwrap_check_mixed tmp1(base_ri.get_ref(), m_local); Chris@49: const unwrap_check_mixed tmp2(base_ci.get_ref(), m_local); Chris@49: Chris@49: const umat& ri = tmp1.M; Chris@49: const umat& ci = tmp2.M; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: ( ((ri.is_vec() == false) && (ri.is_empty() == false)) || ((ci.is_vec() == false) && (ci.is_empty() == false)) ), Chris@49: "Mat::elem(): given object is not a vector" Chris@49: ); Chris@49: Chris@49: const uword* ri_mem = ri.memptr(); Chris@49: const uword ri_n_elem = ri.n_elem; Chris@49: Chris@49: const uword* ci_mem = ci.memptr(); Chris@49: const uword ci_n_elem = ci.n_elem; Chris@49: Chris@49: arma_debug_assert_same_size( ri_n_elem, ci_n_elem, X.n_rows, X.n_cols, "Mat::elem()" ); Chris@49: Chris@49: for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count) Chris@49: { Chris@49: const uword col = ci_mem[ci_count]; Chris@49: Chris@49: arma_debug_check( (col > m_n_cols), "Mat::elem(): index out of bounds" ); Chris@49: Chris@49: for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count) Chris@49: { Chris@49: const uword row = ri_mem[ri_count]; Chris@49: Chris@49: arma_debug_check( (row > m_n_rows), "Mat::elem(): index out of bounds" ); Chris@49: Chris@49: if(is_same_type::value == true) { m_local.at(row,col) = X.at(ri_count, ci_count); } Chris@49: else if(is_same_type::value == true) { m_local.at(row,col) += X.at(ri_count, ci_count); } Chris@49: else if(is_same_type::value == true) { m_local.at(row,col) -= X.at(ri_count, ci_count); } Chris@49: else if(is_same_type::value == true) { m_local.at(row,col) *= X.at(ri_count, ci_count); } Chris@49: else if(is_same_type::value == true) { m_local.at(row,col) /= X.at(ri_count, ci_count); } Chris@49: } Chris@49: } Chris@49: } Chris@49: else Chris@49: if( (all_rows == true) && (all_cols == false) ) Chris@49: { Chris@49: const unwrap_check_mixed tmp2(base_ci.get_ref(), m_local); Chris@49: Chris@49: const umat& ci = tmp2.M; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: ( (ci.is_vec() == false) && (ci.is_empty() == false) ), Chris@49: "Mat::elem(): given object is not a vector" Chris@49: ); Chris@49: Chris@49: const uword* ci_mem = ci.memptr(); Chris@49: const uword ci_n_elem = ci.n_elem; Chris@49: Chris@49: arma_debug_assert_same_size( m_n_rows, ci_n_elem, X.n_rows, X.n_cols, "Mat::elem()" ); Chris@49: Chris@49: for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count) Chris@49: { Chris@49: const uword col = ci_mem[ci_count]; Chris@49: Chris@49: arma_debug_check( (col > m_n_cols), "Mat::elem(): index out of bounds" ); Chris@49: Chris@49: eT* m_colptr = m_local.colptr(col); Chris@49: const eT* X_colptr = X.colptr(ci_count); Chris@49: Chris@49: if(is_same_type::value == true) { arrayops::copy (m_colptr, X_colptr, m_n_rows); } Chris@49: else if(is_same_type::value == true) { arrayops::inplace_plus (m_colptr, X_colptr, m_n_rows); } Chris@49: else if(is_same_type::value == true) { arrayops::inplace_minus(m_colptr, X_colptr, m_n_rows); } Chris@49: else if(is_same_type::value == true) { arrayops::inplace_mul (m_colptr, X_colptr, m_n_rows); } Chris@49: else if(is_same_type::value == true) { arrayops::inplace_div (m_colptr, X_colptr, m_n_rows); } Chris@49: } Chris@49: } Chris@49: else Chris@49: if( (all_rows == false) && (all_cols == true) ) Chris@49: { Chris@49: const unwrap_check_mixed tmp1(base_ri.get_ref(), m_local); Chris@49: Chris@49: const umat& ri = tmp1.M; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: ( (ri.is_vec() == false) && (ri.is_empty() == false) ), Chris@49: "Mat::elem(): given object is not a vector" Chris@49: ); Chris@49: Chris@49: const uword* ri_mem = ri.memptr(); Chris@49: const uword ri_n_elem = ri.n_elem; Chris@49: Chris@49: arma_debug_assert_same_size( ri_n_elem, m_n_cols, X.n_rows, X.n_cols, "Mat::elem()" ); Chris@49: Chris@49: for(uword col=0; col < m_n_cols; ++col) Chris@49: { Chris@49: for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count) Chris@49: { Chris@49: const uword row = ri_mem[ri_count]; Chris@49: Chris@49: arma_debug_check( (row > m_n_rows), "Mat::elem(): index out of bounds" ); Chris@49: Chris@49: if(is_same_type::value == true) { m_local.at(row,col) = X.at(ri_count, col); } Chris@49: else if(is_same_type::value == true) { m_local.at(row,col) += X.at(ri_count, col); } Chris@49: else if(is_same_type::value == true) { m_local.at(row,col) -= X.at(ri_count, col); } Chris@49: else if(is_same_type::value == true) { m_local.at(row,col) *= X.at(ri_count, col); } Chris@49: else if(is_same_type::value == true) { m_local.at(row,col) /= X.at(ri_count, col); } Chris@49: } 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: inline Chris@49: void Chris@49: subview_elem2::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_elem2::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_elem2::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_elem2::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_elem2::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_elem2::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_elem2::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_elem2::operator_equ(const subview_elem2& 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_elem2::operator= (const subview_elem2& 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_elem2::operator= (const subview_elem2& 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_elem2::operator+= (const subview_elem2& 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_elem2::operator-= (const subview_elem2& 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_elem2::operator%= (const subview_elem2& 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_elem2::operator/= (const subview_elem2& 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_elem2::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_elem2::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_elem2::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_elem2::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_elem2::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_elem2::extract(Mat& actual_out, const subview_elem2& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Mat& m_local = const_cast< Mat& >(in.m); Chris@49: Chris@49: const uword m_n_rows = m_local.n_rows; Chris@49: const uword m_n_cols = m_local.n_cols; Chris@49: Chris@49: const bool alias = (&actual_out == &m_local); Chris@49: Chris@49: arma_extra_debug_warn(alias, "subview_elem2::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: if( (in.all_rows == false) && (in.all_cols == false) ) Chris@49: { Chris@49: const unwrap_check_mixed tmp1(in.base_ri.get_ref(), actual_out); Chris@49: const unwrap_check_mixed tmp2(in.base_ci.get_ref(), actual_out); Chris@49: Chris@49: const umat& ri = tmp1.M; Chris@49: const umat& ci = tmp2.M; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: ( ((ri.is_vec() == false) && (ri.is_empty() == false)) || ((ci.is_vec() == false) && (ci.is_empty() == false)) ), Chris@49: "Mat::elem(): given object is not a vector" Chris@49: ); Chris@49: Chris@49: const uword* ri_mem = ri.memptr(); Chris@49: const uword ri_n_elem = ri.n_elem; Chris@49: Chris@49: const uword* ci_mem = ci.memptr(); Chris@49: const uword ci_n_elem = ci.n_elem; Chris@49: Chris@49: out.set_size(ri_n_elem, ci_n_elem); Chris@49: Chris@49: eT* out_mem = out.memptr(); Chris@49: uword out_count = 0; Chris@49: Chris@49: for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count) Chris@49: { Chris@49: const uword col = ci_mem[ci_count]; Chris@49: Chris@49: arma_debug_check( (col > m_n_cols), "Mat::elem(): index out of bounds" ); Chris@49: Chris@49: for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count) Chris@49: { Chris@49: const uword row = ri_mem[ri_count]; Chris@49: Chris@49: arma_debug_check( (row > m_n_rows), "Mat::elem(): index out of bounds" ); Chris@49: Chris@49: out_mem[out_count] = m_local.at(row,col); Chris@49: ++out_count; Chris@49: } Chris@49: } Chris@49: } Chris@49: else Chris@49: if( (in.all_rows == true) && (in.all_cols == false) ) Chris@49: { Chris@49: const unwrap_check_mixed tmp2(in.base_ci.get_ref(), m_local); Chris@49: Chris@49: const umat& ci = tmp2.M; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: ( (ci.is_vec() == false) && (ci.is_empty() == false) ), Chris@49: "Mat::elem(): given object is not a vector" Chris@49: ); Chris@49: Chris@49: const uword* ci_mem = ci.memptr(); Chris@49: const uword ci_n_elem = ci.n_elem; Chris@49: Chris@49: out.set_size(m_n_rows, ci_n_elem); Chris@49: Chris@49: for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count) Chris@49: { Chris@49: const uword col = ci_mem[ci_count]; Chris@49: Chris@49: arma_debug_check( (col > m_n_cols), "Mat::elem(): index out of bounds" ); Chris@49: Chris@49: arrayops::copy( out.colptr(ci_count), m_local.colptr(col), m_n_rows ); Chris@49: } Chris@49: } Chris@49: else Chris@49: if( (in.all_rows == false) && (in.all_cols == true) ) Chris@49: { Chris@49: const unwrap_check_mixed tmp1(in.base_ri.get_ref(), m_local); Chris@49: Chris@49: const umat& ri = tmp1.M; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: ( (ri.is_vec() == false) && (ri.is_empty() == false) ), Chris@49: "Mat::elem(): given object is not a vector" Chris@49: ); Chris@49: Chris@49: const uword* ri_mem = ri.memptr(); Chris@49: const uword ri_n_elem = ri.n_elem; Chris@49: Chris@49: out.set_size(ri_n_elem, m_n_cols); Chris@49: Chris@49: for(uword col=0; col < m_n_cols; ++col) Chris@49: { Chris@49: for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count) Chris@49: { Chris@49: const uword row = ri_mem[ri_count]; Chris@49: Chris@49: arma_debug_check( (row > m_n_rows), "Mat::elem(): index out of bounds" ); Chris@49: Chris@49: out.at(ri_count,col) = m_local.at(row,col); Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: if(alias) Chris@49: { Chris@49: actual_out.steal_mem(out); Chris@49: Chris@49: delete tmp_out; Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // TODO: implement a dedicated function instead of creating a temporary (but lots of potential aliasing issues) Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem2::plus_inplace(Mat& out, const subview_elem2& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const Mat tmp(in); Chris@49: Chris@49: out += tmp; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem2::minus_inplace(Mat& out, const subview_elem2& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const Mat tmp(in); Chris@49: Chris@49: out -= tmp; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem2::schur_inplace(Mat& out, const subview_elem2& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const Mat tmp(in); Chris@49: Chris@49: out %= tmp; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: subview_elem2::div_inplace(Mat& out, const subview_elem2& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const Mat tmp(in); Chris@49: Chris@49: out /= tmp; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! @}