Chris@49: // Copyright (C) 2011-2012 Ryan Curtin Chris@49: // Copyright (C) 2011 Matthew Amidon Chris@49: // Copyright (C) 2012 Conrad Sanderson Chris@49: // Chris@49: // This Source Code Form is subject to the terms of the Mozilla Public Chris@49: // License, v. 2.0. If a copy of the MPL was not distributed with this Chris@49: // file, You can obtain one at http://mozilla.org/MPL/2.0/. Chris@49: Chris@49: Chris@49: //! \addtogroup SpSubview Chris@49: //! @{ Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: SpSubview::SpSubview(const SpMat& 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: , n_nonzero(0) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: // There must be a O(1) way to do this Chris@49: uword lend = m.col_ptrs[in_col1 + in_n_cols]; Chris@49: uword lend_row = in_row1 + in_n_rows; Chris@49: uword count = 0; Chris@49: Chris@49: for(uword i = m.col_ptrs[in_col1]; i < lend; ++i) Chris@49: { Chris@49: if(m.row_indices[i] >= in_row1 && m.row_indices[i] < lend_row) Chris@49: { Chris@49: ++count; Chris@49: } Chris@49: } Chris@49: Chris@49: access::rw(n_nonzero) = count; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: SpSubview::SpSubview(SpMat& 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: , n_nonzero(0) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: // There must be a O(1) way to do this Chris@49: uword lend = m.col_ptrs[in_col1 + in_n_cols]; Chris@49: uword lend_row = in_row1 + in_n_rows; Chris@49: uword count = 0; Chris@49: Chris@49: for(uword i = m.col_ptrs[in_col1]; i < lend; ++i) Chris@49: { Chris@49: if(m.row_indices[i] >= in_row1 && m.row_indices[i] < lend_row) Chris@49: { Chris@49: ++count; Chris@49: } Chris@49: } Chris@49: Chris@49: access::rw(n_nonzero) = count; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: SpSubview::~SpSubview() Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const SpSubview& Chris@49: SpSubview::operator+=(const eT val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: if(val == eT(0)) Chris@49: { Chris@49: return *this; Chris@49: } Chris@49: Chris@49: const uword lstart_row = aux_row1; Chris@49: const uword lend_row = aux_row1 + n_rows; Chris@49: Chris@49: const uword lstart_col = aux_col1; Chris@49: const uword lend_col = aux_col1 + n_cols; Chris@49: Chris@49: const uword old_n_nonzero = m.n_nonzero; Chris@49: Chris@49: // iterate over our part of the sparse matrix Chris@49: for(uword lcol = lstart_col; lcol < lend_col; ++lcol) Chris@49: for(uword lrow = lstart_row; lrow < lend_row; ++lrow) Chris@49: { Chris@49: access::rw(m).at(lrow, lcol) += val; Chris@49: } Chris@49: Chris@49: const uword new_n_nonzero = m.n_nonzero; Chris@49: Chris@49: access::rw(n_nonzero) += (new_n_nonzero - old_n_nonzero); Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const SpSubview& Chris@49: SpSubview::operator-=(const eT val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: if(val == eT(0)) Chris@49: { Chris@49: return *this; Chris@49: } Chris@49: Chris@49: const uword lstart_row = aux_row1; Chris@49: const uword lend_row = aux_row1 + n_rows; Chris@49: Chris@49: const uword lstart_col = aux_col1; Chris@49: const uword lend_col = aux_col1 + n_cols; Chris@49: Chris@49: const uword old_n_nonzero = m.n_nonzero; Chris@49: Chris@49: for(uword lcol = lstart_col; lcol < lend_col; ++lcol) Chris@49: for(uword lrow = lstart_row; lrow < lend_row; ++lrow) Chris@49: { Chris@49: access::rw(m).at(lrow, lcol) -= val; Chris@49: } Chris@49: Chris@49: const uword new_n_nonzero = m.n_nonzero; Chris@49: Chris@49: access::rw(n_nonzero) += (new_n_nonzero - old_n_nonzero); Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const SpSubview& Chris@49: SpSubview::operator*=(const eT val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: if(val == eT(0)) Chris@49: { Chris@49: // Turn it all into zeros. Chris@49: for(iterator it(*this); it != end(); ++it) Chris@49: { Chris@49: (*it) = eT(0); // zero out the value. Chris@49: it.internal_pos--; Chris@49: } Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: const uword lstart_row = aux_row1; Chris@49: const uword lend_row = aux_row1 + n_rows; Chris@49: Chris@49: const uword lstart_col = aux_col1; Chris@49: const uword lend_col = aux_col1 + n_cols; Chris@49: Chris@49: for(uword c = lstart_col; c < lend_col; ++c) Chris@49: { Chris@49: for(uword r = m.col_ptrs[c]; r < m.col_ptrs[c + 1]; ++r) Chris@49: { Chris@49: if(m.row_indices[r] >= lstart_row && m.row_indices[r] < lend_row) Chris@49: { Chris@49: access::rw(m.values[r]) *= val; Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const SpSubview& Chris@49: SpSubview::operator/=(const eT val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const uword lstart_col = aux_col1; Chris@49: const uword lend_col = aux_col1 + n_cols; Chris@49: Chris@49: const uword lstart_row = aux_row1; Chris@49: const uword lend_row = aux_row1 + n_rows; Chris@49: Chris@49: const uword old_n_nonzero = m.n_nonzero; Chris@49: Chris@49: for(uword c = lstart_col; c < lend_col; ++c) Chris@49: for(uword r = lstart_row; r < lend_row; ++r) Chris@49: { Chris@49: access::rw(m).at(r, c) /= val; Chris@49: } Chris@49: Chris@49: const uword new_n_nonzero = m.n_nonzero; Chris@49: Chris@49: access::rw(n_nonzero) += (new_n_nonzero - old_n_nonzero); Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: const SpSubview& Chris@49: SpSubview::operator=(const Base& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const Proxy P(x.get_ref()); Chris@49: Chris@49: arma_debug_assert_same_size(n_rows, n_cols, P.get_n_rows(), P.get_n_cols(), "insert into sparse submatrix"); Chris@49: Chris@49: const uword old_n_nonzero = m.n_nonzero; Chris@49: Chris@49: for(uword c = 0; c < n_cols; ++c) Chris@49: { Chris@49: for(uword r = 0; r < n_rows; ++r) Chris@49: { Chris@49: at(r, c) = P.at(r, c); Chris@49: } Chris@49: } Chris@49: Chris@49: const uword new_n_nonzero = m.n_nonzero; Chris@49: Chris@49: access::rw(n_nonzero) += (new_n_nonzero - old_n_nonzero); Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: const SpSubview& Chris@49: SpSubview::operator+=(const Base& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const Proxy P(x.get_ref()); Chris@49: Chris@49: arma_debug_assert_same_size(n_rows, n_cols, P.get_n_rows(), P.get_n_cols(), "addition"); Chris@49: Chris@49: const uword old_n_nonzero = m.n_nonzero; Chris@49: Chris@49: for(uword c = 0; c < n_cols; ++c) Chris@49: { Chris@49: for(uword r = 0; r < n_rows; ++r) Chris@49: { Chris@49: at(r, c) += P.at(r, c); Chris@49: } Chris@49: } Chris@49: Chris@49: const uword new_n_nonzero = m.n_nonzero; Chris@49: Chris@49: access::rw(n_nonzero) += (new_n_nonzero - old_n_nonzero); Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: const SpSubview& Chris@49: SpSubview::operator-=(const Base& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const Proxy P(x.get_ref()); Chris@49: Chris@49: arma_debug_assert_same_size(n_rows, n_cols, P.get_n_rows(), P.get_n_cols(), "subtraction"); Chris@49: Chris@49: const uword old_n_nonzero = m.n_nonzero; Chris@49: Chris@49: for(uword c = 0; c < n_cols; ++c) Chris@49: { Chris@49: for(uword r = 0; r < n_rows; ++r) Chris@49: { Chris@49: at(r, c) -= P.at(r, c); Chris@49: } Chris@49: } Chris@49: Chris@49: const uword new_n_nonzero = m.n_nonzero; Chris@49: Chris@49: access::rw(n_nonzero) += (new_n_nonzero - old_n_nonzero); Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: const SpSubview& Chris@49: SpSubview::operator*=(const Base& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const Proxy P(x.get_ref()); Chris@49: Chris@49: // Must be exactly the same size for this (we can't modify our own size). Chris@49: arma_debug_assert_same_size(n_rows, n_cols, P.get_n_rows(), P.get_n_cols(), "matrix multiplication"); Chris@49: Chris@49: SpMat tmp(*this); Chris@49: Mat other_tmp(x.get_ref()); Chris@49: tmp *= other_tmp; Chris@49: operator=(tmp); Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: const SpSubview& Chris@49: SpSubview::operator%=(const Base& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const Proxy P(x.get_ref()); Chris@49: Chris@49: arma_debug_assert_same_size(n_rows, n_cols, P.get_n_rows(), P.get_n_cols(), "element-wise multiplication"); Chris@49: Chris@49: const uword old_n_nonzero = m.n_nonzero; Chris@49: Chris@49: for(iterator it(*this); it != end(); ++it) Chris@49: { Chris@49: (*it) *= P.at(it.row(), it.col()); Chris@49: if(P.at(it.row(), it.col()) == eT(0)) Chris@49: { Chris@49: it.internal_pos--; Chris@49: } Chris@49: } Chris@49: Chris@49: const uword new_n_nonzero = m.n_nonzero; Chris@49: Chris@49: access::rw(n_nonzero) += (new_n_nonzero - old_n_nonzero); Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: const SpSubview& Chris@49: SpSubview::operator/=(const Base& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const Proxy P(x.get_ref()); Chris@49: Chris@49: arma_debug_assert_same_size(n_rows, n_cols, P.get_n_rows(), P.get_n_cols(), "element-wise division"); Chris@49: Chris@49: const uword old_n_nonzero = m.n_nonzero; Chris@49: Chris@49: for(uword c = 0; c < n_cols; ++c) Chris@49: { Chris@49: for(uword r = 0; r < n_rows; ++r) Chris@49: { Chris@49: at(r, c) /= P.at(r, c); Chris@49: } Chris@49: } Chris@49: Chris@49: const uword new_n_nonzero = m.n_nonzero; Chris@49: Chris@49: access::rw(n_nonzero) += (new_n_nonzero - old_n_nonzero); Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const SpSubview& Chris@49: SpSubview::operator=(const SpSubview& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_assert_same_size(n_rows, n_cols, x.n_rows, x.n_cols, "insertion into sparse submatrix"); Chris@49: Chris@49: const bool alias = ( &m == &(x.m) ); Chris@49: Chris@49: if(alias == false) Chris@49: { Chris@49: const_iterator cit = x.begin(); Chris@49: iterator it = begin(); Chris@49: Chris@49: while((cit != x.end()) || (it != end())) Chris@49: { Chris@49: if((cit.row() == it.row()) && (cit.col() == it.col())) Chris@49: { Chris@49: (*it) = (*cit); Chris@49: ++it; Chris@49: ++cit; Chris@49: } Chris@49: else Chris@49: { Chris@49: if((cit.col() > it.col()) || ((cit.col() == it.col()) && (cit.row() > it.row()))) Chris@49: { Chris@49: // cit is "ahead" Chris@49: (*it) = eT(0); // erase element Chris@49: it.internal_pos--; // update iterator so it still works Chris@49: ++it; Chris@49: } Chris@49: else Chris@49: { Chris@49: // it is "ahead" Chris@49: at(cit.row(), cit.col()) = (*cit); Chris@49: it.internal_pos++; // update iterator so it still works Chris@49: ++cit; Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: access::rw(n_nonzero) = x.n_nonzero; Chris@49: } Chris@49: else Chris@49: { Chris@49: const SpMat tmp(x); Chris@49: Chris@49: (*this).operator=(tmp); Chris@49: } Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: const SpSubview& Chris@49: SpSubview::operator=(const SpBase& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const SpProxy p(x.get_ref()); Chris@49: Chris@49: arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "insertion into sparse submatrix"); Chris@49: Chris@49: if(p.is_alias(m) == false) Chris@49: { Chris@49: typename SpProxy::const_iterator_type cit = p.begin(); Chris@49: iterator it(*this); Chris@49: Chris@49: while((cit != p.end()) || (it != end())) Chris@49: { Chris@49: if(cit == it) // at the same location Chris@49: { Chris@49: (*it) = (*cit); Chris@49: ++it; Chris@49: ++cit; Chris@49: } Chris@49: else Chris@49: { Chris@49: if((cit.col() > it.col()) || ((cit.col() == it.col()) && (cit.row() > it.row()))) Chris@49: { Chris@49: // cit is "ahead" Chris@49: (*it) = eT(0); // erase element Chris@49: it.internal_pos--; // update iterator so it still works Chris@49: ++it; Chris@49: } Chris@49: else Chris@49: { Chris@49: // it is "ahead" Chris@49: at(cit.row(), cit.col()) = (*cit); Chris@49: it.internal_pos++; // update iterator so it still works Chris@49: ++cit; Chris@49: } Chris@49: } Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: const SpMat tmp(p.Q); Chris@49: Chris@49: (*this).operator=(tmp); Chris@49: } Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: const SpSubview& Chris@49: SpSubview::operator+=(const SpBase& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const SpProxy p(x.get_ref()); Chris@49: Chris@49: arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "addition"); Chris@49: Chris@49: if(p.is_alias(m) == false) Chris@49: { Chris@49: typename SpProxy::const_iterator_type cit = p.begin(); Chris@49: Chris@49: while(cit != p.end()) Chris@49: { Chris@49: at(cit.row(), cit.col()) += (*cit); Chris@49: ++cit; Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: const SpMat tmp(p.Q); Chris@49: Chris@49: (*this).operator+=(tmp); Chris@49: } Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: const SpSubview& Chris@49: SpSubview::operator-=(const SpBase& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const SpProxy p(x.get_ref()); Chris@49: Chris@49: arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "subtraction"); Chris@49: Chris@49: if(p.is_alias(m) == false) Chris@49: { Chris@49: typename SpProxy::const_iterator_type cit = p.begin(); Chris@49: Chris@49: while(cit != p.end()) Chris@49: { Chris@49: at(cit.row(), cit.col()) -= (*cit); Chris@49: ++cit; Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: const SpMat tmp(p.Q); Chris@49: Chris@49: (*this).operator-=(tmp); Chris@49: } Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: const SpSubview& Chris@49: SpSubview::operator*=(const SpBase& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const SpProxy p(x.get_ref()); Chris@49: Chris@49: arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "matrix multiplication"); Chris@49: Chris@49: // Because we have to use a temporary anyway, it doesn't make sense to Chris@49: // reimplement this here. Chris@49: return operator=((*this) * x.get_ref()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: const SpSubview& Chris@49: SpSubview::operator%=(const SpBase& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const SpProxy p(x.get_ref()); Chris@49: Chris@49: arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "element-wise multiplication"); Chris@49: Chris@49: if(p.is_alias(m) == false) Chris@49: { Chris@49: typename SpProxy::const_iterator_type cit = p.begin(); Chris@49: iterator it(*this); Chris@49: Chris@49: while((it != end()) || (cit != p.end())) Chris@49: { Chris@49: if((cit.row() == it.row()) && (cit.col() == it.col())) Chris@49: { Chris@49: (*it) *= (*cit); Chris@49: ++it; Chris@49: ++cit; Chris@49: } Chris@49: else Chris@49: { Chris@49: if((cit.col() > it.col()) || ((cit.col() == it.col()) && (cit.row() > it.row()))) Chris@49: { Chris@49: // cit is "ahead" Chris@49: (*it) = eT(0); // erase element -- x has a zero here Chris@49: it.internal_pos--; // update iterator so it still works Chris@49: ++it; Chris@49: } Chris@49: else Chris@49: { Chris@49: // it is "ahead" Chris@49: ++cit; Chris@49: } Chris@49: } Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: const SpMat tmp(p.Q); Chris@49: Chris@49: (*this).operator%=(tmp); Chris@49: } Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! If you are using this function, you are probably misguided. Chris@49: template Chris@49: template Chris@49: inline Chris@49: const SpSubview& Chris@49: SpSubview::operator/=(const SpBase& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: SpProxy p(x.get_ref()); Chris@49: Chris@49: arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "element-wise division"); Chris@49: Chris@49: if(p.is_alias(m) == false) Chris@49: { Chris@49: for(uword lcol = 0; lcol < n_cols; ++lcol) Chris@49: for(uword lrow = 0; lrow < n_rows; ++lrow) Chris@49: { Chris@49: at(lrow,lcol) /= p.at(lrow,lcol); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: const SpMat tmp(p.Q); Chris@49: Chris@49: (*this).operator/=(tmp); Chris@49: } Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: SpSubview::fill(const eT val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: if(val != eT(0)) Chris@49: { Chris@49: // TODO: implement a faster version; the code below is slow Chris@49: Chris@49: const uword lstart_row = aux_row1; Chris@49: const uword lend_row = aux_row1 + n_rows; Chris@49: Chris@49: const uword lstart_col = aux_col1; Chris@49: const uword lend_col = aux_col1 + n_cols; Chris@49: Chris@49: const uword orig_nonzero = m.n_nonzero; Chris@49: Chris@49: // iterate over our part of the sparse matrix Chris@49: for(uword lcol = lstart_col; lcol < lend_col; ++lcol) Chris@49: for(uword lrow = lstart_row; lrow < lend_row; ++lrow) Chris@49: { Chris@49: access::rw(m).at(lrow, lcol) = val; Chris@49: } Chris@49: Chris@49: access::rw(n_nonzero) += (m.n_nonzero - orig_nonzero); Chris@49: Chris@49: } Chris@49: else Chris@49: { Chris@49: (*this).zeros(); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: SpSubview::zeros() Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: // we can be a little smarter here Chris@49: iterator it(*this); Chris@49: Chris@49: while(it != end()) Chris@49: { Chris@49: (*it) = eT(0); Chris@49: it.internal_pos--; // hack to update iterator without requiring a new one Chris@49: ++it; Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: SpSubview::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: SpSubview::eye() Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: // clear other things Chris@49: (*this).zeros(); Chris@49: Chris@49: const uword orig_nonzero = m.n_nonzero; Chris@49: Chris@49: // now the diagonal ones Chris@49: const uword end_index = std::min(n_rows, n_cols); Chris@49: Chris@49: for(uword ind = 0; ind < end_index; ++ind) Chris@49: { Chris@49: access::rw(m).at(ind + aux_row1, ind + aux_col1) = eT(1); Chris@49: } Chris@49: Chris@49: access::rw(n_nonzero) += (m.n_nonzero - orig_nonzero); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: SpValProxy > Chris@49: SpSubview::operator[](const uword i) Chris@49: { Chris@49: const uword lrow = i % n_rows; Chris@49: const uword lcol = i / n_rows; Chris@49: Chris@49: return (*this).at(lrow, lcol); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: eT Chris@49: SpSubview::operator[](const uword i) const Chris@49: { Chris@49: const uword lrow = i % n_rows; Chris@49: const uword lcol = i / n_rows; Chris@49: Chris@49: return (*this).at(lrow, lcol); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: SpValProxy< SpSubview > Chris@49: SpSubview::operator()(const uword i) Chris@49: { Chris@49: arma_debug_check( (i >= n_elem), "SpSubview::operator(): index out of bounds"); Chris@49: Chris@49: const uword lrow = i % n_rows; Chris@49: const uword lcol = i / n_rows; Chris@49: Chris@49: return (*this).at(lrow, lcol); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: eT Chris@49: SpSubview::operator()(const uword i) const Chris@49: { Chris@49: arma_debug_check( (i >= n_elem), "SpSubview::operator(): index out of bounds"); Chris@49: Chris@49: const uword lrow = i % n_rows; Chris@49: const uword lcol = i / n_rows; Chris@49: Chris@49: return (*this).at(lrow, lcol); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: SpValProxy< SpSubview > Chris@49: SpSubview::operator()(const uword in_row, const uword in_col) Chris@49: { Chris@49: arma_debug_check( (in_row >= n_rows) || (in_col >= n_cols), "SpSubview::operator(): index out of bounds"); Chris@49: Chris@49: return (*this).at(in_row, in_col); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: eT Chris@49: SpSubview::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), "SpSubview::operator(): index out of bounds"); Chris@49: Chris@49: return (*this).at(in_row, in_col); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: SpValProxy< SpSubview > Chris@49: SpSubview::at(const uword i) Chris@49: { Chris@49: const uword lrow = i % n_rows; Chris@49: const uword lcol = i / n_cols; Chris@49: Chris@49: return (*this).at(lrow, lcol); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: eT Chris@49: SpSubview::at(const uword i) const Chris@49: { Chris@49: const uword lrow = i % n_rows; Chris@49: const uword lcol = i / n_cols; Chris@49: Chris@49: return (*this).at(lrow, lcol); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: SpValProxy< SpSubview > Chris@49: SpSubview::at(const uword in_row, const uword in_col) Chris@49: { Chris@49: const uword colptr = m.col_ptrs[in_col + aux_col1]; Chris@49: const uword next_colptr = m.col_ptrs[in_col + aux_col1 + 1]; Chris@49: Chris@49: // Step through the row indices to see if our element exists. Chris@49: for(uword i = colptr; i < next_colptr; ++i) Chris@49: { Chris@49: // First check that we have not stepped past it. Chris@49: if((in_row + aux_row1) < m.row_indices[i]) Chris@49: { Chris@49: return SpValProxy >(in_row, in_col, *this); // Proxy for a zero value. Chris@49: } Chris@49: Chris@49: // Now check if we are at the correct place. Chris@49: if((in_row + aux_row1) == m.row_indices[i]) // If we are, return a reference to the value. Chris@49: { Chris@49: return SpValProxy >(in_row, in_col, *this, &access::rw(m.values[i])); Chris@49: } Chris@49: } Chris@49: Chris@49: // We did not find it, so it does not exist. Chris@49: return SpValProxy >(in_row, in_col, *this); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: eT Chris@49: SpSubview::at(const uword in_row, const uword in_col) const Chris@49: { Chris@49: return m.at(aux_row1 + in_row, aux_col1 + in_col); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: bool Chris@49: SpSubview::check_overlap(const SpSubview& x) const Chris@49: { Chris@49: const subview& t = *this; Chris@49: Chris@49: if(&t.m != &x.m) Chris@49: { Chris@49: return false; Chris@49: } Chris@49: else Chris@49: { Chris@49: if( (t.n_elem == 0) || (x.n_elem == 0) ) Chris@49: { Chris@49: return false; Chris@49: } Chris@49: else Chris@49: { Chris@49: const uword t_row_start = t.aux_row1; Chris@49: const uword t_row_end_p1 = t_row_start + t.n_rows; Chris@49: Chris@49: const uword t_col_start = t.aux_col1; Chris@49: const uword t_col_end_p1 = t_col_start + t.n_cols; Chris@49: Chris@49: 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: const bool outside_rows = ( (x_row_start >= t_row_end_p1) || (t_row_start >= x_row_end_p1) ); Chris@49: const bool outside_cols = ( (x_col_start >= t_col_end_p1) || (t_col_start >= x_col_end_p1) ); Chris@49: Chris@49: return ( (outside_rows == false) && (outside_cols == false) ); Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: bool Chris@49: SpSubview::is_vec() const Chris@49: { Chris@49: return ( (n_rows == 1) || (n_cols == 1) ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: SpSubview Chris@49: SpSubview::row(const uword row_num) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check(row_num >= n_rows, "SpSubview::row(): out of bounds"); Chris@49: Chris@49: return submat(row_num, 0, row_num, n_cols - 1); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const SpSubview Chris@49: SpSubview::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, "SpSubview::row(): out of bounds"); Chris@49: Chris@49: return submat(row_num, 0, row_num, n_cols - 1); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: SpSubview Chris@49: SpSubview::col(const uword col_num) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check(col_num >= n_cols, "SpSubview::col(): out of bounds"); Chris@49: Chris@49: return submat(0, col_num, n_rows - 1, col_num); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const SpSubview Chris@49: SpSubview::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, "SpSubview::col(): out of bounds"); Chris@49: Chris@49: return submat(0, col_num, n_rows - 1, col_num); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: SpSubview Chris@49: SpSubview::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: "SpSubview::rows(): indices out of bounds or incorrectly used" Chris@49: ); Chris@49: Chris@49: return submat(in_row1, 0, in_row2, n_cols - 1); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const SpSubview Chris@49: SpSubview::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: "SpSubview::rows(): indices out of bounds or incorrectly used" Chris@49: ); Chris@49: Chris@49: return submat(in_row1, 0, in_row2, n_cols - 1); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: SpSubview Chris@49: SpSubview::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: "SpSubview::cols(): indices out of bounds or incorrectly used" Chris@49: ); Chris@49: Chris@49: return submat(0, in_col1, n_rows - 1, in_col2); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const SpSubview Chris@49: SpSubview::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: "SpSubview::cols(): indices out of bounds or incorrectly used" Chris@49: ); Chris@49: Chris@49: return submat(0, in_col1, n_rows - 1, in_col2); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: SpSubview Chris@49: SpSubview::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: "SpSubview::submat(): indices out of bounds or incorrectly used" Chris@49: ); Chris@49: Chris@49: return access::rw(m).submat(in_row1 + aux_row1, in_col1 + aux_col1, in_row2 + aux_row1, in_col2 + aux_col1); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const SpSubview Chris@49: SpSubview::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: "SpSubview::submat(): indices out of bounds or incorrectly used" Chris@49: ); Chris@49: Chris@49: return m.submat(in_row1 + aux_row1, in_col1 + aux_col1, in_row2 + aux_row1, in_col2 + aux_col1); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: SpSubview Chris@49: SpSubview::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 = row_span.whole; Chris@49: Chris@49: const uword in_row1 = row_all ? 0 : row_span.a; Chris@49: const uword in_row2 = row_all ? n_rows : row_span.b; Chris@49: Chris@49: const uword in_col1 = col_all ? 0 : col_span.a; Chris@49: const uword in_col2 = col_all ? n_cols : col_span.b; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= n_rows))) Chris@49: || Chris@49: ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= n_cols))), Chris@49: "SpSubview::submat(): indices out of bounds or incorrectly used" Chris@49: ); Chris@49: Chris@49: return submat(in_row1, in_col1, in_row2, in_col2); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const SpSubview Chris@49: SpSubview::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 = row_span.whole; Chris@49: Chris@49: const uword in_row1 = row_all ? 0 : row_span.a; Chris@49: const uword in_row2 = row_all ? n_rows - 1 : row_span.b; Chris@49: Chris@49: const uword in_col1 = col_all ? 0 : col_span.a; Chris@49: const uword in_col2 = col_all ? n_cols - 1 : col_span.b; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= n_rows))) Chris@49: || Chris@49: ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= n_cols))), Chris@49: "SpSubview::submat(): indices out of bounds or incorrectly used" Chris@49: ); Chris@49: Chris@49: return submat(in_row1, in_col1, in_row2, in_col2); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: SpSubview Chris@49: SpSubview::operator()(const uword row_num, const span& col_span) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return submat(span(row_num, row_num), col_span); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const SpSubview Chris@49: SpSubview::operator()(const uword row_num, const span& col_span) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return submat(span(row_num, row_num), col_span); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: SpSubview Chris@49: SpSubview::operator()(const span& row_span, const uword col_num) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return submat(row_span, span(col_num, col_num)); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const SpSubview Chris@49: SpSubview::operator()(const span& row_span, const uword col_num) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return submat(row_span, span(col_num, col_num)); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: SpSubview Chris@49: SpSubview::operator()(const span& row_span, const span& col_span) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return submat(row_span, col_span); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const SpSubview Chris@49: SpSubview::operator()(const span& row_span, const span& col_span) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return submat(row_span, col_span); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: SpSubview::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((in_row1 >= n_rows) || (in_row2 >= n_rows), "SpSubview::swap_rows(): invalid row index"); Chris@49: Chris@49: const uword lstart_col = aux_col1; Chris@49: const uword lend_col = aux_col1 + n_cols; Chris@49: Chris@49: for(uword c = lstart_col; c < lend_col; ++c) Chris@49: { Chris@49: eT val = m.at(in_row1 + aux_row1, c); Chris@49: access::rw(m).at(in_row2 + aux_row1, c) = m.at(in_row1 + aux_row1, c); Chris@49: access::rw(m).at(in_row1 + aux_row1, c) = val; Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: SpSubview::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((in_col1 >= n_cols) || (in_col2 >= n_cols), "SpSubview::swap_cols(): invalid column index"); Chris@49: Chris@49: const uword lstart_row = aux_row1; Chris@49: const uword lend_row = aux_row1 + n_rows; Chris@49: Chris@49: for(uword r = lstart_row; r < lend_row; ++r) Chris@49: { Chris@49: eT val = m.at(r, in_col1 + aux_col1); Chris@49: access::rw(m).at(r, in_col1 + aux_col1) = m.at(r, in_col2 + aux_col1); Chris@49: access::rw(m).at(r, in_col2 + aux_col1) = val; Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: typename SpSubview::iterator Chris@49: SpSubview::begin() Chris@49: { Chris@49: return iterator(*this); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: typename SpSubview::const_iterator Chris@49: SpSubview::begin() const Chris@49: { Chris@49: return const_iterator(*this); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: typename SpSubview::iterator Chris@49: SpSubview::begin_col(const uword col_num) Chris@49: { Chris@49: return iterator(*this, 0, col_num); Chris@49: } Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: typename SpSubview::const_iterator Chris@49: SpSubview::begin_col(const uword col_num) const Chris@49: { Chris@49: return const_iterator(*this, 0, col_num); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: typename SpSubview::row_iterator Chris@49: SpSubview::begin_row(const uword row_num) Chris@49: { Chris@49: return row_iterator(*this, row_num, 0); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: typename SpSubview::const_row_iterator Chris@49: SpSubview::begin_row(const uword row_num) const Chris@49: { Chris@49: return const_row_iterator(*this, row_num, 0); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: typename SpSubview::iterator Chris@49: SpSubview::end() Chris@49: { Chris@49: return iterator(*this, 0, n_cols, n_nonzero, m.n_nonzero - n_nonzero); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: typename SpSubview::const_iterator Chris@49: SpSubview::end() const Chris@49: { Chris@49: return const_iterator(*this, 0, n_cols, n_nonzero, m.n_nonzero - n_nonzero); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: typename SpSubview::row_iterator Chris@49: SpSubview::end_row() Chris@49: { Chris@49: return row_iterator(*this, n_nonzero); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: typename SpSubview::const_row_iterator Chris@49: SpSubview::end_row() const Chris@49: { Chris@49: return const_row_iterator(*this, n_nonzero); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: typename SpSubview::row_iterator Chris@49: SpSubview::end_row(const uword row_num) Chris@49: { Chris@49: return row_iterator(*this, row_num + 1, 0); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: typename SpSubview::const_row_iterator Chris@49: SpSubview::end_row(const uword row_num) const Chris@49: { Chris@49: return const_row_iterator(*this, row_num + 1, 0); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: arma_hot Chris@49: arma_warn_unused Chris@49: eT& Chris@49: SpSubview::add_element(const uword in_row, const uword in_col, const eT in_val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: // This may not actually add an element. Chris@49: const uword old_n_nonzero = m.n_nonzero; Chris@49: eT& retval = access::rw(m).add_element(in_row + aux_row1, in_col + aux_col1, in_val); Chris@49: // Update n_nonzero (if necessary). Chris@49: access::rw(n_nonzero) += (m.n_nonzero - old_n_nonzero); Chris@49: Chris@49: return retval; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: SpSubview::delete_element(const uword in_row, const uword in_col) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: // This may not actually delete an element. Chris@49: const uword old_n_nonzero = m.n_nonzero; Chris@49: access::rw(m).delete_element(in_row + aux_row1, in_col + aux_col1); Chris@49: access::rw(n_nonzero) -= (old_n_nonzero - m.n_nonzero); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: /** Chris@49: * Sparse subview col Chris@49: * Chris@49: template Chris@49: inline Chris@49: SpSubview_col::SpSubview_col(const Mat& in_m, const uword in_col) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: template Chris@49: inline Chris@49: SpSubview_col::SpSubview_col(Mat& in_m, const uword in_col) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: template Chris@49: inline Chris@49: SpSubview_col::SpSubview_col(const Mat& in_m, const uword in_col, const uword in_row1, const uword in_n_rows) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: template Chris@49: inline Chris@49: SpSubview_col::SpSubview_col(Mat& in_m, const uword in_col, const uword in_row1, const uword in_n_rows) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: */ Chris@49: Chris@49: /** Chris@49: * Sparse subview row Chris@49: * Chris@49: template Chris@49: inline Chris@49: SpSubview_row::SpSubview_row(const Mat& in_m, const uword in_row) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: template Chris@49: inline Chris@49: SpSubview_row::SpSubview_row(Mat& in_m, const uword in_row) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: template Chris@49: inline Chris@49: SpSubview_row::SpSubview_row(const Mat& in_m, const uword in_row, const uword in_col1, const uword in_n_cols) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: template Chris@49: inline Chris@49: SpSubview_row::SpSubview_row(Mat& in_m, const uword in_row, const uword in_col1, const uword in_n_cols) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: */ Chris@49: Chris@49: Chris@49: //! @}