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 Row Chris@49: //! @{ Chris@49: Chris@49: Chris@49: //! construct an empty row vector Chris@49: template Chris@49: inline Chris@49: Row::Row() Chris@49: : Mat(arma_vec_indicator(), 2) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: Row::Row(const Row& X) Chris@49: : Mat(arma_vec_indicator(), 1, X.n_elem, 2) 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 row vector with the specified number of n_elem Chris@49: template Chris@49: inline Chris@49: Row::Row(const uword in_n_elem) Chris@49: : Mat(arma_vec_indicator(), 1, in_n_elem, 2) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: Row::Row(const uword in_n_rows, const uword in_n_cols) Chris@49: : Mat(arma_vec_indicator(), 2) 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: template Chris@49: inline Chris@49: Row::Row(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: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const Row& Chris@49: Row::operator=(const char* text) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Mat::operator=(text); Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: Row::Row(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: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const Row& Chris@49: Row::operator=(const std::string& text) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Mat::operator=(text); Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! create a row vector from std::vector Chris@49: template Chris@49: inline Chris@49: Row::Row(const std::vector& x) Chris@49: : Mat(arma_vec_indicator(), 1, uword(x.size()), 2) 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 row vector from std::vector Chris@49: template Chris@49: inline Chris@49: const Row& Chris@49: Row::operator=(const std::vector& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Mat::init_warm(1, uword(x.size())); 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: Row::Row(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: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const Row& Chris@49: Row::operator=(const std::initializer_list& list) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Mat::operator=(list); 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: Row::Row(const SpRow& X) Chris@49: : Mat(arma_vec_indicator(), 1, X.n_elem, 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 SpRow::const_iterator it = X.begin(); it != X.end(); ++it) Chris@49: at(it.col()) = (*it); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const Row& Chris@49: Row::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: Row::Row(const Base& X) Chris@49: : Mat(arma_vec_indicator(), 2) 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 Row& Chris@49: Row::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 row vector from a given auxiliary array Chris@49: template Chris@49: inline Chris@49: Row::Row(eT* aux_mem, const uword aux_length, const bool copy_aux_mem, const bool strict) Chris@49: : Mat(aux_mem, 1, aux_length, copy_aux_mem, strict) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: access::rw(Mat::vec_state) = 2; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! construct a row vector from a given auxiliary array Chris@49: template Chris@49: inline Chris@49: Row::Row(const eT* aux_mem, const uword aux_length) Chris@49: : Mat(aux_mem, 1, aux_length) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: access::rw(Mat::vec_state) = 2; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: Row::Row 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) = 2; 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: Row::Row(const BaseCube& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: access::rw(Mat::vec_state) = 2; 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 Row& Chris@49: Row::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: Row::Row(const subview_cube& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: access::rw(Mat::vec_state) = 2; Chris@49: Chris@49: Mat::operator=(X); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const Row& Chris@49: Row::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< Row > Chris@49: Row::operator<<(const eT val) Chris@49: { Chris@49: return mat_injector< Row >(*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: Row::t() const Chris@49: { Chris@49: return Op,op_htrans>(*this); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const Op,op_htrans> Chris@49: Row::ht() const Chris@49: { Chris@49: return Op,op_htrans>(*this); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const Op,op_strans> Chris@49: Row::st() const Chris@49: { Chris@49: return Op,op_strans>(*this); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: eT& Chris@49: Row::col(const uword col_num) Chris@49: { Chris@49: arma_debug_check( (col_num >= Mat::n_cols), "Row::col(): index out of bounds" ); Chris@49: Chris@49: return access::rw(Mat::mem[col_num]); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: eT Chris@49: Row::col(const uword col_num) const Chris@49: { Chris@49: arma_debug_check( (col_num >= Mat::n_cols), "Row::col(): index out of bounds" ); Chris@49: Chris@49: return Mat::mem[col_num]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: subview_row Chris@49: Row::cols(const uword in_col1, const uword in_col2) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= Mat::n_cols) ), "Row::cols(): indices out of bounds or incorrectly used"); Chris@49: Chris@49: const uword subview_n_cols = in_col2 - in_col1 + 1; Chris@49: Chris@49: return subview_row(*this, 0, in_col1, subview_n_cols); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const subview_row Chris@49: Row::cols(const uword in_col1, const uword in_col2) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= Mat::n_cols) ), "Row::cols(): indices out of bounds or incorrectly used"); Chris@49: Chris@49: const uword subview_n_cols = in_col2 - in_col1 + 1; Chris@49: Chris@49: return subview_row(*this, 0, in_col1, subview_n_cols); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: subview_row Chris@49: Row::subvec(const uword in_col1, const uword in_col2) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= Mat::n_cols) ), "Row::subvec(): indices out of bounds or incorrectly used"); Chris@49: Chris@49: const uword subview_n_cols = in_col2 - in_col1 + 1; Chris@49: Chris@49: return subview_row(*this, 0, in_col1, subview_n_cols); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const subview_row Chris@49: Row::subvec(const uword in_col1, const uword in_col2) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= Mat::n_cols) ), "Row::subvec(): indices out of bounds or incorrectly used"); Chris@49: Chris@49: const uword subview_n_cols = in_col2 - in_col1 + 1; Chris@49: Chris@49: return subview_row(*this, 0, in_col1, subview_n_cols); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: subview_row Chris@49: Row::subvec(const span& col_span) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const bool col_all = col_span.whole; Chris@49: Chris@49: const uword local_n_cols = Mat::n_cols; Chris@49: Chris@49: const uword in_col1 = col_all ? 0 : col_span.a; Chris@49: const uword in_col2 = col_span.b; Chris@49: const uword subvec_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; Chris@49: Chris@49: arma_debug_check( ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ), "Row::subvec(): indices out of bounds or incorrectly used"); Chris@49: Chris@49: return subview_row(*this, 0, in_col1, subvec_n_cols); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const subview_row Chris@49: Row::subvec(const span& col_span) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const bool col_all = col_span.whole; Chris@49: Chris@49: const uword local_n_cols = Mat::n_cols; Chris@49: Chris@49: const uword in_col1 = col_all ? 0 : col_span.a; Chris@49: const uword in_col2 = col_span.b; Chris@49: const uword subvec_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; Chris@49: Chris@49: arma_debug_check( ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ), "Row::subvec(): indices out of bounds or incorrectly used"); Chris@49: Chris@49: return subview_row(*this, 0, in_col1, subvec_n_cols); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: subview_row Chris@49: Row::operator()(const span& col_span) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return subvec(col_span); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const subview_row Chris@49: Row::operator()(const span& col_span) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return subvec(col_span); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! remove specified columns Chris@49: template Chris@49: inline Chris@49: void Chris@49: Row::shed_col(const uword col_num) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_check( col_num >= Mat::n_cols, "Row::shed_col(): index out of bounds"); Chris@49: Chris@49: shed_cols(col_num, col_num); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! remove specified columns Chris@49: template Chris@49: inline Chris@49: void Chris@49: Row::shed_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 >= Mat::n_cols), Chris@49: "Row::shed_cols(): indices out of bounds or incorrectly used" Chris@49: ); Chris@49: Chris@49: const uword n_keep_front = in_col1; Chris@49: const uword n_keep_back = Mat::n_cols - (in_col2 + 1); Chris@49: Chris@49: Row 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_col2+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 cols at the specified col position, Chris@49: //! optionally setting the elements of the inserted cols to zero Chris@49: template Chris@49: inline Chris@49: void Chris@49: Row::insert_cols(const uword col_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_cols = Mat::n_cols; Chris@49: Chris@49: const uword A_n_cols = col_num; Chris@49: const uword B_n_cols = t_n_cols - col_num; Chris@49: Chris@49: // insertion at col_num == n_cols is in effect an append operation Chris@49: arma_debug_check( (col_num > t_n_cols), "Row::insert_cols(): index out of bounds"); Chris@49: Chris@49: if(N > 0) Chris@49: { Chris@49: Row out(t_n_cols + 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_cols > 0) Chris@49: { Chris@49: arrayops::copy( out_mem, t_mem, A_n_cols ); Chris@49: } Chris@49: Chris@49: if(B_n_cols > 0) Chris@49: { Chris@49: arrayops::copy( &(out_mem[col_num + N]), &(t_mem[col_num]), B_n_cols ); Chris@49: } Chris@49: Chris@49: if(set_to_zero == true) Chris@49: { Chris@49: arrayops::inplace_set( &(out_mem[col_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 col position; Chris@49: //! the given object must have one row Chris@49: template Chris@49: template Chris@49: inline Chris@49: void Chris@49: Row::insert_cols(const uword col_num, const Base& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Mat::insert_cols(col_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: Row::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: Row::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: Row::at(const uword, const uword in_col) Chris@49: { Chris@49: return access::rw( Mat::mem[in_col] ); 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: Row::at(const uword, const uword in_col) const Chris@49: { Chris@49: return Mat::mem[in_col]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: typename Row::row_iterator Chris@49: Row::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(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: typename Row::const_row_iterator Chris@49: Row::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(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: typename Row::row_iterator Chris@49: Row::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() + Mat::n_cols; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: typename Row::const_row_iterator Chris@49: Row::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() + Mat::n_cols; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: Row::fixed::fixed() Chris@49: : Row( 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: Row::fixed::fixed(const fixed& X) Chris@49: : Row( 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: arma_inline Chris@49: Row::fixed::fixed(const subview_cube& X) Chris@49: : Row( 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: Row::operator=(X); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: template Chris@49: arma_inline Chris@49: Row::fixed::fixed(const Base& A) Chris@49: : Row( 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: Row::operator=(A.get_ref()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: template Chris@49: arma_inline Chris@49: Row::fixed::fixed(const Base& A, const Base& B) Chris@49: : Row( 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: Row::init(A,B); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: Row::fixed::fixed(const eT* aux_mem) Chris@49: : Row( 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: template Chris@49: template Chris@49: inline Chris@49: Row::fixed::fixed(const char* text) Chris@49: : Row( 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: Row::operator=(text); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: Row::fixed::fixed(const std::string& text) Chris@49: : Row( 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: Row::operator=(text); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: template Chris@49: const Row& Chris@49: Row::fixed::operator=(const Base& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Row::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 Row& Chris@49: Row::fixed::operator=(const eT val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Row::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 Row& Chris@49: Row::fixed::operator=(const char* text) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Row::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 Row& Chris@49: Row::fixed::operator=(const std::string& text) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Row::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 Row& Chris@49: Row::fixed::operator=(const subview_cube& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: Row::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: Row::fixed::fixed(const std::initializer_list& list) Chris@49: : Row( 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 Row& Chris@49: Row::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), "Row::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 Row::template fixed::Row_fixed_type, op_htrans > Chris@49: Row::fixed::t() const Chris@49: { Chris@49: return Op< typename Row::template fixed::Row_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 Row::template fixed::Row_fixed_type, op_htrans > Chris@49: Row::fixed::ht() const Chris@49: { Chris@49: return Op< typename Row::template fixed::Row_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 Row::template fixed::Row_fixed_type, op_strans > Chris@49: Row::fixed::st() const Chris@49: { Chris@49: return Op< typename Row::template fixed::Row_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: Row::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: Row::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: Row::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: Row::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: Row::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: Row::fixed::operator() (const uword ii) Chris@49: { Chris@49: arma_debug_check( (ii >= fixed_n_elem), "Row::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: Row::fixed::operator() (const uword ii) const Chris@49: { Chris@49: arma_debug_check( (ii >= fixed_n_elem), "Row::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: Row::fixed::at(const uword, const uword in_col) Chris@49: { Chris@49: return (use_extra) ? mem_local_extra[in_col] : Mat::mem_local[in_col]; 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: Row::fixed::at(const uword, const uword in_col) const Chris@49: { Chris@49: return (use_extra) ? mem_local_extra[in_col] : Mat::mem_local[in_col]; 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: Row::fixed::operator() (const uword in_row, const uword in_col) Chris@49: { Chris@49: arma_debug_check( ((in_row > 0) || (in_col >= fixed_n_elem)), "Row::operator(): index out of bounds" ); Chris@49: Chris@49: return (use_extra) ? mem_local_extra[in_col] : Mat::mem_local[in_col]; 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: Row::fixed::operator() (const uword in_row, const uword in_col) const Chris@49: { Chris@49: arma_debug_check( ((in_row > 0) || (in_col >= fixed_n_elem)), "Row::operator(): index out of bounds" ); Chris@49: Chris@49: return (use_extra) ? mem_local_extra[in_col] : Mat::mem_local[in_col]; 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: Row::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: Row::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 Row& Chris@49: Row::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 Row& Chris@49: Row::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 Row& Chris@49: Row::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: Row::Row(const arma_fixed_indicator&, const uword in_n_elem, const eT* in_mem) Chris@49: : Mat(arma_fixed_indicator(), 1, in_n_elem, 2, 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_ROW_MEAT Chris@49: #include ARMA_INCFILE_WRAP(ARMA_EXTRA_ROW_MEAT) Chris@49: #endif Chris@49: Chris@49: Chris@49: Chris@49: //! @}