Chris@49: // Copyright (C) 2008-2013 NICTA (www.nicta.com.au) Chris@49: // Copyright (C) 2008-2013 Conrad Sanderson Chris@49: // Copyright (C) 2011 James Sanders Chris@49: // Chris@49: // This Source Code Form is subject to the terms of the Mozilla Public Chris@49: // License, v. 2.0. If a copy of the MPL was not distributed with this Chris@49: // file, You can obtain one at http://mozilla.org/MPL/2.0/. Chris@49: Chris@49: Chris@49: //! \addtogroup subview Chris@49: //! @{ Chris@49: Chris@49: Chris@49: //! Class for storing data required to construct or apply operations to a submatrix Chris@49: //! (i.e. where the submatrix starts and ends as well as a reference/pointer to the original matrix), Chris@49: template Chris@49: class subview : public Base > Chris@49: { Chris@49: public: Chris@49: Chris@49: typedef eT elem_type; Chris@49: typedef typename get_pod_type::result pod_type; Chris@49: Chris@49: arma_aligned const Mat& m; Chris@49: Chris@49: static const bool is_row = false; Chris@49: static const bool is_col = false; Chris@49: Chris@49: const uword aux_row1; Chris@49: const uword aux_col1; Chris@49: Chris@49: const uword n_rows; Chris@49: const uword n_cols; Chris@49: const uword n_elem; Chris@49: Chris@49: protected: Chris@49: Chris@49: arma_inline subview(const Mat& in_m, const uword in_row1, const uword in_col1, const uword in_n_rows, const uword in_n_cols); Chris@49: Chris@49: Chris@49: public: Chris@49: Chris@49: inline ~subview(); Chris@49: Chris@49: inline void operator+= (const eT val); Chris@49: inline void operator-= (const eT val); Chris@49: inline void operator*= (const eT val); Chris@49: inline void operator/= (const eT val); Chris@49: Chris@49: // deliberately returning void Chris@49: template inline void operator= (const Base& x); Chris@49: template inline void operator+= (const Base& x); Chris@49: template inline void operator-= (const Base& x); Chris@49: template inline void operator%= (const Base& x); Chris@49: template inline void operator/= (const Base& x); Chris@49: Chris@49: inline void operator= (const subview& x); Chris@49: inline void operator+= (const subview& x); Chris@49: inline void operator-= (const subview& x); Chris@49: inline void operator%= (const subview& x); Chris@49: inline void operator/= (const subview& x); Chris@49: Chris@49: inline static void extract(Mat& out, const subview& in); Chris@49: Chris@49: inline static void plus_inplace(Mat& out, const subview& in); Chris@49: inline static void minus_inplace(Mat& out, const subview& in); Chris@49: inline static void schur_inplace(Mat& out, const subview& in); Chris@49: inline static void div_inplace(Mat& out, const subview& in); Chris@49: Chris@49: template inline void transform(functor F); Chris@49: template inline void imbue(functor F); Chris@49: Chris@49: inline void fill(const eT val); Chris@49: inline void zeros(); Chris@49: inline void ones(); Chris@49: inline void eye(); Chris@49: Chris@49: inline eT at_alt (const uword ii) const; Chris@49: Chris@49: inline eT& operator[](const uword ii); Chris@49: inline eT operator[](const uword ii) const; Chris@49: Chris@49: inline eT& operator()(const uword ii); Chris@49: inline eT operator()(const uword ii) const; Chris@49: Chris@49: inline eT& operator()(const uword in_row, const uword in_col); Chris@49: inline eT operator()(const uword in_row, const uword in_col) const; Chris@49: Chris@49: inline eT& at(const uword in_row, const uword in_col); Chris@49: inline eT at(const uword in_row, const uword in_col) const; Chris@49: Chris@49: arma_inline eT* colptr(const uword in_col); Chris@49: arma_inline const eT* colptr(const uword in_col) const; Chris@49: Chris@49: inline bool check_overlap(const subview& x) const; Chris@49: Chris@49: inline bool is_vec() const; Chris@49: Chris@49: inline subview_row row(const uword row_num); Chris@49: inline const subview_row row(const uword row_num) const; Chris@49: Chris@49: inline subview_row operator()(const uword row_num, const span& col_span); Chris@49: inline const subview_row operator()(const uword row_num, const span& col_span) const; Chris@49: Chris@49: inline subview_col col(const uword col_num); Chris@49: inline const subview_col col(const uword col_num) const; Chris@49: Chris@49: inline subview_col operator()(const span& row_span, const uword col_num); Chris@49: inline const subview_col operator()(const span& row_span, const uword col_num) const; Chris@49: Chris@49: inline Col unsafe_col(const uword col_num); Chris@49: inline const Col unsafe_col(const uword col_num) const; Chris@49: Chris@49: inline subview rows(const uword in_row1, const uword in_row2); Chris@49: inline const subview rows(const uword in_row1, const uword in_row2) const; Chris@49: Chris@49: inline subview cols(const uword in_col1, const uword in_col2); Chris@49: inline const subview cols(const uword in_col1, const uword in_col2) const; Chris@49: Chris@49: inline subview submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2); Chris@49: inline const subview submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const; Chris@49: Chris@49: inline subview submat (const span& row_span, const span& col_span); Chris@49: inline const subview submat (const span& row_span, const span& col_span) const; Chris@49: Chris@49: inline subview operator()(const span& row_span, const span& col_span); Chris@49: inline const subview operator()(const span& row_span, const span& col_span) const; Chris@49: Chris@49: inline subview_each1< subview, 0 > each_col(); Chris@49: inline subview_each1< subview, 1 > each_row(); Chris@49: Chris@49: template inline subview_each2< subview, 0, T1 > each_col(const Base& indices); Chris@49: template inline subview_each2< subview, 1, T1 > each_row(const Base& indices); Chris@49: Chris@49: inline diagview diag(const sword in_id = 0); Chris@49: inline const diagview diag(const sword in_id = 0) const; Chris@49: Chris@49: inline void swap_rows(const uword in_row1, const uword in_row2); Chris@49: inline void swap_cols(const uword in_col1, const uword in_col2); Chris@49: Chris@49: Chris@49: // // primitive forward iterator Chris@49: // class iter Chris@49: // { Chris@49: // public: Chris@49: // Chris@49: // inline iter(const subview& in_M); Chris@49: // Chris@49: // arma_inline eT operator* () const; Chris@49: // Chris@49: // inline void operator++(); Chris@49: // inline void operator++(int); Chris@49: // Chris@49: // Chris@49: // private: Chris@49: // Chris@49: // arma_aligned const eT* mem; Chris@49: // Chris@49: // arma_aligned uword n_rows; Chris@49: // Chris@49: // arma_aligned uword row_start; Chris@49: // arma_aligned uword row_end_p1; Chris@49: // Chris@49: // arma_aligned uword row; Chris@49: // arma_aligned uword col; Chris@49: // arma_aligned uword i; Chris@49: // }; Chris@49: Chris@49: Chris@49: private: Chris@49: Chris@49: friend class Mat; Chris@49: subview(); Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: class subview_col : public subview Chris@49: { Chris@49: public: Chris@49: Chris@49: typedef eT elem_type; Chris@49: typedef typename get_pod_type::result pod_type; Chris@49: Chris@49: static const bool is_row = false; Chris@49: static const bool is_col = true; Chris@49: Chris@49: const eT* colmem; Chris@49: Chris@49: inline void operator= (const subview& x); Chris@49: inline void operator= (const subview_col& x); Chris@49: Chris@49: template Chris@49: inline void operator= (const Base& x); Chris@49: Chris@49: arma_inline const Op,op_htrans> t() const; Chris@49: arma_inline const Op,op_htrans> ht() const; Chris@49: arma_inline const Op,op_strans> st() const; Chris@49: Chris@49: arma_inline eT at_alt (const uword i) const; Chris@49: Chris@49: arma_inline eT& operator[](const uword i); Chris@49: arma_inline eT operator[](const uword i) const; Chris@49: Chris@49: inline eT& operator()(const uword i); Chris@49: inline eT operator()(const uword i) const; Chris@49: Chris@49: inline eT& operator()(const uword in_row, const uword in_col); Chris@49: inline eT operator()(const uword in_row, const uword in_col) const; Chris@49: Chris@49: inline eT& at(const uword in_row, const uword in_col); Chris@49: inline eT at(const uword in_row, const uword in_col) const; Chris@49: Chris@49: arma_inline eT* colptr(const uword in_col); Chris@49: arma_inline const eT* colptr(const uword in_col) const; Chris@49: Chris@49: inline subview_col rows(const uword in_row1, const uword in_row2); Chris@49: inline const subview_col rows(const uword in_row1, const uword in_row2) const; Chris@49: Chris@49: inline subview_col subvec(const uword in_row1, const uword in_row2); Chris@49: inline const subview_col subvec(const uword in_row1, const uword in_row2) const; Chris@49: Chris@49: // TODO: add operator()(span) Chris@49: Chris@49: protected: Chris@49: Chris@49: inline subview_col(const Mat& in_m, const uword in_col); Chris@49: inline subview_col(const Mat& in_m, const uword in_col, const uword in_row1, const uword in_n_rows); Chris@49: Chris@49: Chris@49: private: Chris@49: Chris@49: friend class Mat; Chris@49: friend class Col; Chris@49: friend class subview; Chris@49: Chris@49: subview_col(); Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: class subview_row : public subview Chris@49: { Chris@49: public: Chris@49: Chris@49: typedef eT elem_type; Chris@49: typedef typename get_pod_type::result pod_type; Chris@49: Chris@49: static const bool is_row = true; Chris@49: static const bool is_col = false; Chris@49: Chris@49: inline void operator= (const subview& x); Chris@49: inline void operator= (const subview_row& x); Chris@49: Chris@49: template Chris@49: inline void operator= (const Base& x); Chris@49: Chris@49: arma_inline const Op,op_htrans> t() const; Chris@49: arma_inline const Op,op_htrans> ht() const; Chris@49: arma_inline const Op,op_strans> st() const; Chris@49: Chris@49: inline eT at_alt (const uword i) const; Chris@49: Chris@49: inline eT& operator[](const uword i); Chris@49: inline eT operator[](const uword i) const; Chris@49: Chris@49: inline eT& operator()(const uword i); Chris@49: inline eT operator()(const uword i) const; Chris@49: Chris@49: inline eT& operator()(const uword in_row, const uword in_col); Chris@49: inline eT operator()(const uword in_row, const uword in_col) const; Chris@49: Chris@49: inline eT& at(const uword in_row, const uword in_col); Chris@49: inline eT at(const uword in_row, const uword in_col) const; Chris@49: Chris@49: inline subview_row cols(const uword in_col1, const uword in_col2); Chris@49: inline const subview_row cols(const uword in_col1, const uword in_col2) const; Chris@49: Chris@49: inline subview_row subvec(const uword in_col1, const uword in_col2); Chris@49: inline const subview_row subvec(const uword in_col1, const uword in_col2) const; Chris@49: Chris@49: // TODO: add operator()(span) Chris@49: Chris@49: protected: Chris@49: Chris@49: inline subview_row(const Mat& in_m, const uword in_row); Chris@49: inline subview_row(const Mat& in_m, const uword in_row, const uword in_col1, const uword in_n_cols); Chris@49: Chris@49: Chris@49: private: Chris@49: Chris@49: friend class Mat; Chris@49: friend class Row; Chris@49: friend class subview; Chris@49: Chris@49: subview_row(); Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: class subview_row_strans : public Base > Chris@49: { Chris@49: public: Chris@49: Chris@49: typedef eT elem_type; Chris@49: typedef typename get_pod_type::result pod_type; Chris@49: Chris@49: static const bool is_row = false; Chris@49: static const bool is_col = true; Chris@49: Chris@49: arma_aligned const subview_row& sv_row; Chris@49: Chris@49: const uword n_rows; // equal to n_elem Chris@49: const uword n_elem; Chris@49: static const uword n_cols = 1; Chris@49: Chris@49: Chris@49: inline explicit subview_row_strans(const subview_row& in_sv_row); Chris@49: Chris@49: inline void extract(Mat& out) const; Chris@49: Chris@49: inline eT at_alt (const uword i) const; Chris@49: Chris@49: inline eT operator[](const uword i) const; Chris@49: inline eT operator()(const uword i) const; Chris@49: Chris@49: inline eT operator()(const uword in_row, const uword in_col) const; Chris@49: inline eT at(const uword in_row, const uword in_col) const; Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: class subview_row_htrans : public Base > Chris@49: { Chris@49: public: Chris@49: Chris@49: typedef eT elem_type; Chris@49: typedef typename get_pod_type::result pod_type; Chris@49: Chris@49: static const bool is_row = false; Chris@49: static const bool is_col = true; Chris@49: Chris@49: arma_aligned const subview_row& sv_row; Chris@49: Chris@49: const uword n_rows; // equal to n_elem Chris@49: const uword n_elem; Chris@49: static const uword n_cols = 1; Chris@49: Chris@49: Chris@49: inline explicit subview_row_htrans(const subview_row& in_sv_row); Chris@49: Chris@49: inline void extract(Mat& out) const; Chris@49: Chris@49: inline eT at_alt (const uword i) const; Chris@49: Chris@49: inline eT operator[](const uword i) const; Chris@49: inline eT operator()(const uword i) const; Chris@49: Chris@49: inline eT operator()(const uword in_row, const uword in_col) const; Chris@49: inline eT at(const uword in_row, const uword in_col) const; Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: //! @}