Chris@49: // Copyright (C) 2008-2013 NICTA (www.nicta.com.au) Chris@49: // Copyright (C) 2008-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 Col Chris@49: //! @{ Chris@49: Chris@49: Chris@49: //! construct an empty column vector Chris@49: template Chris@49: inline Chris@49: Col::Col() Chris@49: : Mat(arma_vec_indicator(), 1) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: Col::Col(const Col& X) Chris@49: : Mat(arma_vec_indicator(), X.n_elem, 1, 1) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arrayops::copy((*this).memptr(), X.memptr(), X.n_elem); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! construct a column vector with the specified number of n_elem Chris@49: template Chris@49: inline Chris@49: Col::Col(const uword in_n_elem) Chris@49: : Mat(arma_vec_indicator(), in_n_elem, 1, 1) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: Col::Col(const uword in_n_rows, const uword in_n_cols) Chris@49: : Mat(arma_vec_indicator(), 0, 0, 1) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Mat::init_warm(in_n_rows, in_n_cols); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! construct a column vector from specified text Chris@49: template Chris@49: inline Chris@49: Col::Col(const char* text) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: access::rw(Mat::vec_state) = 2; Chris@49: Chris@49: Mat::operator=(text); Chris@49: Chris@49: std::swap( access::rw(Mat::n_rows), access::rw(Mat::n_cols) ); Chris@49: Chris@49: access::rw(Mat::vec_state) = 1; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! construct a column vector from specified text Chris@49: template Chris@49: inline Chris@49: const Col& Chris@49: Col::operator=(const char* text) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: access::rw(Mat::vec_state) = 2; Chris@49: Chris@49: Mat::operator=(text); Chris@49: Chris@49: std::swap( access::rw(Mat::n_rows), access::rw(Mat::n_cols) ); Chris@49: Chris@49: access::rw(Mat::vec_state) = 1; Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! construct a column vector from specified text Chris@49: template Chris@49: inline Chris@49: Col::Col(const std::string& text) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: access::rw(Mat::vec_state) = 2; Chris@49: Chris@49: Mat::operator=(text); Chris@49: Chris@49: std::swap( access::rw(Mat::n_rows), access::rw(Mat::n_cols) ); Chris@49: Chris@49: access::rw(Mat::vec_state) = 1; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! construct a column vector from specified text Chris@49: template Chris@49: inline Chris@49: const Col& Chris@49: Col::operator=(const std::string& text) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: access::rw(Mat::vec_state) = 2; Chris@49: Chris@49: Mat::operator=(text); Chris@49: Chris@49: std::swap( access::rw(Mat::n_rows), access::rw(Mat::n_cols) ); Chris@49: Chris@49: access::rw(Mat::vec_state) = 1; Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! create a column vector from std::vector Chris@49: template Chris@49: inline Chris@49: Col::Col(const std::vector& x) Chris@49: : Mat(arma_vec_indicator(), uword(x.size()), 1, 1) Chris@49: { Chris@49: arma_extra_debug_sigprint_this(this); Chris@49: Chris@49: if(x.size() > 0) Chris@49: { Chris@49: arrayops::copy( Mat::memptr(), &(x[0]), uword(x.size()) ); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! create a column vector from std::vector Chris@49: template Chris@49: inline Chris@49: const Col& Chris@49: Col::operator=(const std::vector& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Mat::init_warm(uword(x.size()), 1); Chris@49: Chris@49: if(x.size() > 0) Chris@49: { Chris@49: arrayops::copy( Mat::memptr(), &(x[0]), uword(x.size()) ); Chris@49: } Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: #if defined(ARMA_USE_CXX11) Chris@49: Chris@49: template Chris@49: inline Chris@49: Col::Col(const std::initializer_list& list) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: access::rw(Mat::vec_state) = 2; Chris@49: Chris@49: Mat::operator=(list); Chris@49: Chris@49: std::swap( access::rw(Mat::n_rows), access::rw(Mat::n_cols) ); Chris@49: Chris@49: access::rw(Mat::vec_state) = 1; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const Col& Chris@49: Col::operator=(const std::initializer_list& list) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: access::rw(Mat::vec_state) = 2; Chris@49: Chris@49: Mat::operator=(list); Chris@49: Chris@49: std::swap( access::rw(Mat::n_rows), access::rw(Mat::n_cols) ); Chris@49: Chris@49: access::rw(Mat::vec_state) = 1; Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: #endif Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: Col::Col(const SpCol& X) Chris@49: : Mat(arma_vec_indicator(), X.n_elem, 1, 1) Chris@49: { Chris@49: arma_extra_debug_sigprint_this(this); Chris@49: Chris@49: arrayops::inplace_set(Mat::memptr(), eT(0), X.n_elem); Chris@49: Chris@49: for(typename SpCol::const_iterator it = X.begin(); it != X.end(); ++it) Chris@49: at(it.row()) = (*it); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const Col& Chris@49: Col::operator=(const eT val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Mat::operator=(val); 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: Col::Col(const Base& X) Chris@49: : Mat(arma_vec_indicator(), 1) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Mat::operator=(X.get_ref()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: const Col& Chris@49: Col::operator=(const Base& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Mat::operator=(X.get_ref()); Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! construct a column vector from a given auxiliary array of eTs Chris@49: template Chris@49: inline Chris@49: Col::Col(eT* aux_mem, const uword aux_length, const bool copy_aux_mem, const bool strict) Chris@49: : Mat(aux_mem, aux_length, 1, copy_aux_mem, strict) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: access::rw(Mat::vec_state) = 1; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! construct a column vector from a given auxiliary array of eTs Chris@49: template Chris@49: inline Chris@49: Col::Col(const eT* aux_mem, const uword aux_length) Chris@49: : Mat(aux_mem, aux_length, 1) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: access::rw(Mat::vec_state) = 1; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: Col::Col Chris@49: ( Chris@49: const Base::pod_type, T1>& A, Chris@49: const Base::pod_type, T2>& B Chris@49: ) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: access::rw(Mat::vec_state) = 1; Chris@49: Chris@49: Mat::init(A,B); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: Col::Col(const BaseCube& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: access::rw(Mat::vec_state) = 1; Chris@49: Chris@49: Mat::operator=(X); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: const Col& Chris@49: Col::operator=(const BaseCube& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Mat::operator=(X); Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: Col::Col(const subview_cube& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: access::rw(Mat::vec_state) = 1; Chris@49: Chris@49: Mat::operator=(X); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const Col& Chris@49: Col::operator=(const subview_cube& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Mat::operator=(X); Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: mat_injector< Col > Chris@49: Col::operator<<(const eT val) Chris@49: { Chris@49: return mat_injector< Col >(*this, val); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const Op,op_htrans> Chris@49: 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: 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: 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: Col::row(const uword row_num) Chris@49: { Chris@49: arma_debug_check( (row_num >= Mat::n_rows), "Col::row(): index out of bounds" ); Chris@49: Chris@49: return access::rw(Mat::mem[row_num]); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: eT Chris@49: Col::row(const uword row_num) const Chris@49: { Chris@49: arma_debug_check( (row_num >= Mat::n_rows), "Col::row(): index out of bounds" ); Chris@49: Chris@49: return Mat::mem[row_num]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: subview_col Chris@49: 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 >= Mat::n_rows) ), "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: return subview_col(*this, 0, in_row1, subview_n_rows); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const subview_col Chris@49: 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 >= Mat::n_rows) ), "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: return subview_col(*this, 0, in_row1, subview_n_rows); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: subview_col Chris@49: 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 >= Mat::n_rows) ), "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: return subview_col(*this, 0, in_row1, subview_n_rows); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const subview_col Chris@49: 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 >= Mat::n_rows) ), "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: return subview_col(*this, 0, in_row1, subview_n_rows); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: subview_col Chris@49: Col::subvec(const span& row_span) 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 = Mat::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 subvec_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; Chris@49: Chris@49: arma_debug_check( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ), "Col::subvec(): indices out of bounds or incorrectly used"); Chris@49: Chris@49: return subview_col(*this, 0, in_row1, subvec_n_rows); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const subview_col Chris@49: Col::subvec(const span& row_span) 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 = Mat::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 subvec_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; Chris@49: Chris@49: arma_debug_check( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ), "Col::subvec(): indices out of bounds or incorrectly used"); Chris@49: Chris@49: return subview_col(*this, 0, in_row1, subvec_n_rows); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: subview_col Chris@49: Col::operator()(const span& row_span) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return subvec(row_span); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const subview_col Chris@49: Col::operator()(const span& row_span) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return subvec(row_span); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! remove specified row Chris@49: template Chris@49: inline Chris@49: void Chris@49: Col::shed_row(const uword row_num) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( row_num >= Mat::n_rows, "Col::shed_row(): index out of bounds"); Chris@49: Chris@49: shed_rows(row_num, row_num); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! remove specified rows Chris@49: template Chris@49: inline Chris@49: void Chris@49: Col::shed_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 >= Mat::n_rows), Chris@49: "Col::shed_rows(): indices out of bounds or incorrectly used" Chris@49: ); Chris@49: Chris@49: const uword n_keep_front = in_row1; Chris@49: const uword n_keep_back = Mat::n_rows - (in_row2 + 1); Chris@49: Chris@49: Col X(n_keep_front + n_keep_back); Chris@49: Chris@49: eT* X_mem = X.memptr(); Chris@49: const eT* t_mem = (*this).memptr(); Chris@49: Chris@49: if(n_keep_front > 0) Chris@49: { Chris@49: arrayops::copy( X_mem, t_mem, n_keep_front ); Chris@49: } Chris@49: Chris@49: if(n_keep_back > 0) Chris@49: { Chris@49: arrayops::copy( &(X_mem[n_keep_front]), &(t_mem[in_row2+1]), n_keep_back); Chris@49: } Chris@49: Chris@49: Mat::steal_mem(X); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! insert N rows at the specified row position, Chris@49: //! optionally setting the elements of the inserted rows to zero Chris@49: template Chris@49: inline Chris@49: void Chris@49: Col::insert_rows(const uword row_num, const uword N, const bool set_to_zero) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const uword t_n_rows = Mat::n_rows; Chris@49: Chris@49: const uword A_n_rows = row_num; Chris@49: const uword B_n_rows = t_n_rows - row_num; Chris@49: Chris@49: // insertion at row_num == n_rows is in effect an append operation Chris@49: arma_debug_check( (row_num > t_n_rows), "Col::insert_rows(): index out of bounds"); Chris@49: Chris@49: if(N > 0) Chris@49: { Chris@49: Col out(t_n_rows + N); Chris@49: Chris@49: eT* out_mem = out.memptr(); Chris@49: const eT* t_mem = (*this).memptr(); Chris@49: Chris@49: if(A_n_rows > 0) Chris@49: { Chris@49: arrayops::copy( out_mem, t_mem, A_n_rows ); Chris@49: } Chris@49: Chris@49: if(B_n_rows > 0) Chris@49: { Chris@49: arrayops::copy( &(out_mem[row_num + N]), &(t_mem[row_num]), B_n_rows ); Chris@49: } Chris@49: Chris@49: if(set_to_zero == true) Chris@49: { Chris@49: arrayops::inplace_set( &(out_mem[row_num]), eT(0), N ); Chris@49: } Chris@49: Chris@49: Mat::steal_mem(out); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! insert the given object at the specified row position; Chris@49: //! the given object must have one column Chris@49: template Chris@49: template Chris@49: inline Chris@49: void Chris@49: Col::insert_rows(const uword row_num, const Base& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Mat::insert_rows(row_num, X); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: arma_warn_unused Chris@49: eT& Chris@49: Col::at(const uword i) Chris@49: { Chris@49: return access::rw(Mat::mem[i]); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: arma_warn_unused Chris@49: const eT& Chris@49: Col::at(const uword i) const Chris@49: { Chris@49: return Mat::mem[i]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: arma_warn_unused Chris@49: eT& Chris@49: Col::at(const uword in_row, const uword) Chris@49: { Chris@49: return access::rw( Mat::mem[in_row] ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: arma_warn_unused Chris@49: const eT& Chris@49: Col::at(const uword in_row, const uword) const Chris@49: { Chris@49: return Mat::mem[in_row]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: typename Col::row_iterator Chris@49: Col::begin_row(const uword row_num) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( (row_num >= Mat::n_rows), "begin_row(): index out of bounds"); Chris@49: Chris@49: return Mat::memptr() + row_num; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: typename Col::const_row_iterator Chris@49: Col::begin_row(const uword row_num) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( (row_num >= Mat::n_rows), "begin_row(): index out of bounds"); Chris@49: Chris@49: return Mat::memptr() + row_num; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: typename Col::row_iterator Chris@49: Col::end_row(const uword row_num) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( (row_num >= Mat::n_rows), "end_row(): index out of bounds"); Chris@49: Chris@49: return Mat::memptr() + row_num + 1; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: typename Col::const_row_iterator Chris@49: Col::end_row(const uword row_num) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( (row_num >= Mat::n_rows), "end_row(): index out of bounds"); Chris@49: Chris@49: return Mat::memptr() + row_num + 1; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_inline Chris@49: void Chris@49: Col::fixed::change_to_row() Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: access::rw(Mat::n_cols) = fixed_n_elem; Chris@49: access::rw(Mat::n_rows) = 1; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_inline Chris@49: Col::fixed::fixed() Chris@49: : Col( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) Chris@49: { Chris@49: arma_extra_debug_sigprint_this(this); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_inline Chris@49: Col::fixed::fixed(const fixed& X) Chris@49: : Col( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) Chris@49: { Chris@49: arma_extra_debug_sigprint_this(this); Chris@49: Chris@49: eT* dest = (use_extra) ? mem_local_extra : Mat::mem_local; Chris@49: Chris@49: arrayops::copy( dest, X.mem, fixed_n_elem ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: Col::fixed::fixed(const subview_cube& X) Chris@49: : Col( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) Chris@49: { Chris@49: arma_extra_debug_sigprint_this(this); Chris@49: Chris@49: Col::operator=(X); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: template Chris@49: inline Chris@49: Col::fixed::fixed(const Base& A) Chris@49: : Col( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) Chris@49: { Chris@49: arma_extra_debug_sigprint_this(this); Chris@49: Chris@49: Col::operator=(A.get_ref()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: template Chris@49: inline Chris@49: Col::fixed::fixed(const Base& A, const Base& B) Chris@49: : Col( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) Chris@49: { Chris@49: arma_extra_debug_sigprint_this(this); Chris@49: Chris@49: Col::init(A,B); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: Col::fixed::fixed(const eT* aux_mem) Chris@49: : Col( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) Chris@49: { Chris@49: arma_extra_debug_sigprint_this(this); Chris@49: Chris@49: eT* dest = (use_extra) ? mem_local_extra : Mat::mem_local; Chris@49: Chris@49: arrayops::copy( dest, aux_mem, fixed_n_elem ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! NOTE: this function relies on Chris@49: //! Col::operator=(text), to change vec_state as well as swapping n_rows and n_cols, Chris@49: //! and Mat::init(), to check that the given vector will not have a different size than fixed_n_elem. Chris@49: template Chris@49: template Chris@49: inline Chris@49: Col::fixed::fixed(const char* text) Chris@49: : Col( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) Chris@49: { Chris@49: arma_extra_debug_sigprint_this(this); Chris@49: Chris@49: change_to_row(); Chris@49: Chris@49: Col::operator=(text); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! NOTE: this function relies on Chris@49: //! Col::operator=(text), to change vec_state as well as swapping n_rows and n_cols, Chris@49: //! and Mat::init(), to check that the given vector will not have a different size than fixed_n_elem. Chris@49: template Chris@49: template Chris@49: inline Chris@49: Col::fixed::fixed(const std::string& text) Chris@49: : Col( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) Chris@49: { Chris@49: arma_extra_debug_sigprint_this(this); Chris@49: Chris@49: change_to_row(); Chris@49: Chris@49: Col::operator=(text); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: template Chris@49: const Col& Chris@49: Col::fixed::operator=(const Base& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Col::operator=(A.get_ref()); Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: const Col& Chris@49: Col::fixed::operator=(const eT val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Col::operator=(val); Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: const Col& Chris@49: Col::fixed::operator=(const char* text) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: change_to_row(); Chris@49: Chris@49: Col::operator=(text); Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: const Col& Chris@49: Col::fixed::operator=(const std::string& text) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: change_to_row(); Chris@49: Chris@49: Col::operator=(text); Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: const Col& Chris@49: Col::fixed::operator=(const subview_cube& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Col::operator=(X); Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: #if defined(ARMA_USE_CXX11) Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: Col::fixed::fixed(const std::initializer_list& list) Chris@49: : Col( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) Chris@49: { Chris@49: arma_extra_debug_sigprint_this(this); Chris@49: Chris@49: (*this).operator=(list); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: const Col& Chris@49: Col::fixed::operator=(const std::initializer_list& list) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const uword N = list.size(); Chris@49: Chris@49: arma_debug_check( (N > fixed_n_elem), "Col::fixed: initialiser list is too long" ); Chris@49: Chris@49: eT* this_mem = (*this).memptr(); Chris@49: Chris@49: arrayops::copy( this_mem, list.begin(), N ); Chris@49: Chris@49: for(uword iq=N; iq < fixed_n_elem; ++iq) { this_mem[iq] = eT(0); } Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: #endif Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_inline Chris@49: const Op< typename Col::template fixed::Col_fixed_type, op_htrans > Chris@49: Col::fixed::t() const Chris@49: { Chris@49: return Op< typename Col::template fixed::Col_fixed_type, op_htrans >(*this); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_inline Chris@49: const Op< typename Col::template fixed::Col_fixed_type, op_htrans > Chris@49: Col::fixed::ht() const Chris@49: { Chris@49: return Op< typename Col::template fixed::Col_fixed_type, op_htrans >(*this); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_inline Chris@49: const Op< typename Col::template fixed::Col_fixed_type, op_strans > Chris@49: Col::fixed::st() const Chris@49: { Chris@49: return Op< typename Col::template fixed::Col_fixed_type, op_strans >(*this); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_inline Chris@49: arma_warn_unused Chris@49: const eT& Chris@49: Col::fixed::at_alt(const uword ii) const Chris@49: { Chris@49: #if defined(ARMA_HAVE_ALIGNED_ATTRIBUTE) Chris@49: Chris@49: return (use_extra) ? mem_local_extra[ii] : Mat::mem_local[ii]; Chris@49: Chris@49: #else Chris@49: const eT* mem_aligned = (use_extra) ? mem_local_extra : Mat::mem_local; Chris@49: Chris@49: memory::mark_as_aligned(mem_aligned); Chris@49: Chris@49: return mem_aligned[ii]; Chris@49: #endif Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_inline Chris@49: arma_warn_unused Chris@49: eT& Chris@49: Col::fixed::operator[] (const uword ii) Chris@49: { Chris@49: return (use_extra) ? mem_local_extra[ii] : Mat::mem_local[ii]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_inline Chris@49: arma_warn_unused Chris@49: const eT& Chris@49: Col::fixed::operator[] (const uword ii) const Chris@49: { Chris@49: return (use_extra) ? mem_local_extra[ii] : Mat::mem_local[ii]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_inline Chris@49: arma_warn_unused Chris@49: eT& Chris@49: Col::fixed::at(const uword ii) Chris@49: { Chris@49: return (use_extra) ? mem_local_extra[ii] : Mat::mem_local[ii]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_inline Chris@49: arma_warn_unused Chris@49: const eT& Chris@49: Col::fixed::at(const uword ii) const Chris@49: { Chris@49: return (use_extra) ? mem_local_extra[ii] : Mat::mem_local[ii]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_inline Chris@49: arma_warn_unused Chris@49: eT& Chris@49: Col::fixed::operator() (const uword ii) Chris@49: { Chris@49: arma_debug_check( (ii >= fixed_n_elem), "Col::operator(): index out of bounds"); Chris@49: Chris@49: return (use_extra) ? mem_local_extra[ii] : Mat::mem_local[ii]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_inline Chris@49: arma_warn_unused Chris@49: const eT& Chris@49: Col::fixed::operator() (const uword ii) const Chris@49: { Chris@49: arma_debug_check( (ii >= fixed_n_elem), "Col::operator(): index out of bounds"); Chris@49: Chris@49: return (use_extra) ? mem_local_extra[ii] : Mat::mem_local[ii]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_inline Chris@49: arma_warn_unused Chris@49: eT& Chris@49: Col::fixed::at(const uword in_row, const uword) Chris@49: { Chris@49: return (use_extra) ? mem_local_extra[in_row] : Mat::mem_local[in_row]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_inline Chris@49: arma_warn_unused Chris@49: const eT& Chris@49: Col::fixed::at(const uword in_row, const uword) const Chris@49: { Chris@49: return (use_extra) ? mem_local_extra[in_row] : Mat::mem_local[in_row]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_inline Chris@49: arma_warn_unused Chris@49: eT& Chris@49: Col::fixed::operator() (const uword in_row, const uword in_col) Chris@49: { Chris@49: arma_debug_check( ((in_row >= fixed_n_elem) || (in_col > 0)), "Col::operator(): index out of bounds" ); Chris@49: Chris@49: return (use_extra) ? mem_local_extra[in_row] : Mat::mem_local[in_row]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_inline Chris@49: arma_warn_unused Chris@49: const eT& Chris@49: Col::fixed::operator() (const uword in_row, const uword in_col) const Chris@49: { Chris@49: arma_debug_check( ((in_row >= fixed_n_elem) || (in_col > 0)), "Col::operator(): index out of bounds" ); Chris@49: Chris@49: return (use_extra) ? mem_local_extra[in_row] : Mat::mem_local[in_row]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_inline Chris@49: arma_warn_unused Chris@49: eT* Chris@49: Col::fixed::memptr() Chris@49: { Chris@49: return (use_extra) ? mem_local_extra : Mat::mem_local; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_inline Chris@49: arma_warn_unused Chris@49: const eT* Chris@49: Col::fixed::memptr() const Chris@49: { Chris@49: return (use_extra) ? mem_local_extra : Mat::mem_local; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: const Col& Chris@49: Col::fixed::fill(const eT val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(Mat::mem_local[0]); Chris@49: Chris@49: arrayops::inplace_set_fixed( mem_use, val ); Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: const Col& Chris@49: Col::fixed::zeros() Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(Mat::mem_local[0]); Chris@49: Chris@49: arrayops::inplace_set_fixed( mem_use, eT(0) ); Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: const Col& Chris@49: Col::fixed::ones() Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(Mat::mem_local[0]); Chris@49: Chris@49: arrayops::inplace_set_fixed( mem_use, eT(1) ); Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: Col::Col(const arma_fixed_indicator&, const uword in_n_elem, const eT* in_mem) Chris@49: : Mat(arma_fixed_indicator(), in_n_elem, 1, 1, in_mem) Chris@49: { Chris@49: arma_extra_debug_sigprint_this(this); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: #ifdef ARMA_EXTRA_COL_MEAT Chris@49: #include ARMA_INCFILE_WRAP(ARMA_EXTRA_COL_MEAT) Chris@49: #endif Chris@49: Chris@49: Chris@49: Chris@49: //! @}