Chris@49: // Copyright (C) 2008-2012 NICTA (www.nicta.com.au) Chris@49: // Copyright (C) 2008-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 fn_conv_to Chris@49: //! @{ Chris@49: Chris@49: Chris@49: Chris@49: //! conversion from Armadillo Base and BaseCube objects to scalars Chris@49: //! (kept only for compatibility with old code; use as_scalar() instead for Base objects like Mat) Chris@49: template Chris@49: class conv_to Chris@49: { Chris@49: public: Chris@49: Chris@49: template Chris@49: inline static out_eT from(const Base& in, const typename arma_not_cx::result* junk = 0); Chris@49: Chris@49: template Chris@49: inline static out_eT from(const Base& in, const typename arma_cx_only::result* junk = 0); Chris@49: Chris@49: template Chris@49: inline static out_eT from(const BaseCube& in, const typename arma_not_cx::result* junk = 0); Chris@49: Chris@49: template Chris@49: inline static out_eT from(const BaseCube& in, const typename arma_cx_only::result* junk = 0); Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: out_eT Chris@49: conv_to::from(const Base& in, const typename arma_not_cx::result* junk) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: arma_type_check(( is_supported_elem_type::value == false )); Chris@49: Chris@49: const unwrap tmp(in.get_ref()); Chris@49: const Mat& X = tmp.M; Chris@49: Chris@49: arma_debug_check( (X.n_elem != 1), "conv_to(): given object doesn't have exactly one element" ); Chris@49: Chris@49: return out_eT(X.mem[0]); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: out_eT Chris@49: conv_to::from(const Base& in, const typename arma_cx_only::result* junk) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: arma_type_check(( is_supported_elem_type::value == false )); Chris@49: Chris@49: const unwrap tmp(in.get_ref()); Chris@49: const Mat& X = tmp.M; Chris@49: Chris@49: arma_debug_check( (X.n_elem != 1), "conv_to(): given object doesn't have exactly one element" ); Chris@49: Chris@49: out_eT out; Chris@49: Chris@49: arrayops::convert_cx_scalar(out, X.mem[0]); Chris@49: Chris@49: return out; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: out_eT Chris@49: conv_to::from(const BaseCube& in, const typename arma_not_cx::result* junk) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: arma_type_check(( is_supported_elem_type::value == false )); Chris@49: Chris@49: const unwrap_cube tmp(in.get_ref()); Chris@49: const Cube& X = tmp.M; Chris@49: Chris@49: arma_debug_check( (X.n_elem != 1), "conv_to(): given object doesn't have exactly one element" ); Chris@49: Chris@49: return out_eT(X.mem[0]); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: out_eT Chris@49: conv_to::from(const BaseCube& in, const typename arma_cx_only::result* junk) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: arma_type_check(( is_supported_elem_type::value == false )); Chris@49: Chris@49: const unwrap_cube tmp(in.get_ref()); Chris@49: const Cube& X = tmp.M; Chris@49: Chris@49: arma_debug_check( (X.n_elem != 1), "conv_to(): given object doesn't have exactly one element" ); Chris@49: Chris@49: out_eT out; Chris@49: Chris@49: arrayops::convert_cx_scalar(out, X.mem[0]); Chris@49: Chris@49: return out; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! conversion to Armadillo matrices from Armadillo Base objects, as well as from std::vector Chris@49: template Chris@49: class conv_to< Mat > Chris@49: { Chris@49: public: Chris@49: Chris@49: template Chris@49: inline static Mat from(const Base& in, const typename arma_not_cx::result* junk = 0); Chris@49: Chris@49: template Chris@49: inline static Mat from(const Base& in, const typename arma_cx_only::result* junk = 0); Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline static Mat from(const std::vector& in, const typename arma_not_cx::result* junk = 0); Chris@49: Chris@49: template Chris@49: inline static Mat from(const std::vector& in, const typename arma_cx_only::result* junk = 0); Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: Mat Chris@49: conv_to< Mat >::from(const Base& in, const typename arma_not_cx::result* junk) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: const unwrap tmp(in.get_ref()); Chris@49: const Mat& X = tmp.M; Chris@49: Chris@49: Mat out(X.n_rows, X.n_cols); Chris@49: Chris@49: arrayops::convert( out.memptr(), X.memptr(), out.n_elem ); Chris@49: Chris@49: return out; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: Mat Chris@49: conv_to< Mat >::from(const Base& in, const typename arma_cx_only::result* junk) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: const unwrap tmp(in.get_ref()); Chris@49: const Mat& X = tmp.M; Chris@49: Chris@49: Mat out(X.n_rows, X.n_cols); Chris@49: Chris@49: arrayops::convert_cx( out.memptr(), X.memptr(), out.n_elem ); Chris@49: Chris@49: return out; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: Mat Chris@49: conv_to< Mat >::from(const std::vector& in, const typename arma_not_cx::result* junk) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: const uword N = uword( in.size() ); Chris@49: Chris@49: Mat out(N, 1); Chris@49: Chris@49: if(N > 0) Chris@49: { Chris@49: out_eT* out_mem = out.memptr(); Chris@49: const in_eT* in_mem = &(in[0]); Chris@49: Chris@49: for(uword i=0; i Chris@49: template Chris@49: inline Chris@49: Mat Chris@49: conv_to< Mat >::from(const std::vector& in, const typename arma_cx_only::result* junk) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: Mat out(in.size(), 1); Chris@49: Chris@49: typename std::vector::const_iterator in_begin = in.begin(); Chris@49: typename std::vector::const_iterator in_end = in.end(); Chris@49: Chris@49: typename Mat::iterator out_begin = out.begin(); Chris@49: typename Mat::iterator out_end = out.end(); Chris@49: Chris@49: typename std::vector::const_iterator in_it; Chris@49: typename Mat::iterator out_it; Chris@49: Chris@49: for(in_it = in_begin, out_it = out_begin; (in_it != in_end) && (out_it != out_end); ++in_it, ++out_it) Chris@49: { Chris@49: out_eT& out_elem = (*out_it); Chris@49: const in_eT& in_elem = (*in_it); Chris@49: Chris@49: arrayops::convert_cx_scalar(out_elem, in_elem); Chris@49: } Chris@49: Chris@49: return out; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! conversion to Armadillo row vectors from Armadillo Base objects, as well as from std::vector Chris@49: template Chris@49: class conv_to< Row > Chris@49: { Chris@49: public: Chris@49: Chris@49: template Chris@49: inline static Row from(const Base& in, const typename arma_not_cx::result* junk = 0); Chris@49: Chris@49: template Chris@49: inline static Row from(const Base& in, const typename arma_cx_only::result* junk = 0); Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline static Row from(const std::vector& in, const typename arma_not_cx::result* junk = 0); Chris@49: Chris@49: template Chris@49: inline static Row from(const std::vector& in, const typename arma_cx_only::result* junk = 0); Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: Row Chris@49: conv_to< Row >::from(const Base& in, const typename arma_not_cx::result* junk) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: const unwrap tmp(in.get_ref()); Chris@49: const Mat& X = tmp.M; Chris@49: Chris@49: arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" ); Chris@49: Chris@49: Row out(X.n_elem); Chris@49: Chris@49: arrayops::convert( out.memptr(), X.memptr(), out.n_elem ); Chris@49: Chris@49: return out; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: Row Chris@49: conv_to< Row >::from(const Base& in, const typename arma_cx_only::result* junk) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: const unwrap tmp(in.get_ref()); Chris@49: const Mat& X = tmp.M; Chris@49: Chris@49: arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" ); Chris@49: Chris@49: Row out(X.n_rows, X.n_cols); Chris@49: Chris@49: arrayops::convert_cx( out.memptr(), X.memptr(), out.n_elem ); Chris@49: Chris@49: return out; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: Row Chris@49: conv_to< Row >::from(const std::vector& in, const typename arma_not_cx::result* junk) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: const uword N = uword( in.size() ); Chris@49: Chris@49: Row out(N); Chris@49: Chris@49: if(N > 0) Chris@49: { Chris@49: out_eT* out_mem = out.memptr(); Chris@49: const in_eT* in_mem = &(in[0]); Chris@49: Chris@49: for(uword i=0; i Chris@49: template Chris@49: inline Chris@49: Row Chris@49: conv_to< Row >::from(const std::vector& in, const typename arma_cx_only::result* junk) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: Row out( in.size() ); Chris@49: Chris@49: typename std::vector::const_iterator in_begin = in.begin(); Chris@49: typename std::vector::const_iterator in_end = in.end(); Chris@49: Chris@49: typename Row::iterator out_begin = out.begin(); Chris@49: typename Row::iterator out_end = out.end(); Chris@49: Chris@49: typename std::vector::const_iterator in_it; Chris@49: typename Row::iterator out_it; Chris@49: Chris@49: for(in_it = in_begin, out_it = out_begin; (in_it != in_end) && (out_it != out_end); ++in_it, ++out_it) Chris@49: { Chris@49: out_eT& out_elem = (*out_it); Chris@49: const in_eT& in_elem = (*in_it); Chris@49: Chris@49: arrayops::convert_cx_scalar(out_elem, in_elem); Chris@49: } Chris@49: Chris@49: return out; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! conversion to Armadillo column vectors from Armadillo Base objects, as well as from std::vector Chris@49: template Chris@49: class conv_to< Col > Chris@49: { Chris@49: public: Chris@49: Chris@49: template Chris@49: inline static Col from(const Base& in, const typename arma_not_cx::result* junk = 0); Chris@49: Chris@49: template Chris@49: inline static Col from(const Base& in, const typename arma_cx_only::result* junk = 0); Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline static Col from(const std::vector& in, const typename arma_not_cx::result* junk = 0); Chris@49: Chris@49: template Chris@49: inline static Col from(const std::vector& in, const typename arma_cx_only::result* junk = 0); Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: Col Chris@49: conv_to< Col >::from(const Base& in, const typename arma_not_cx::result* junk) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: const unwrap tmp(in.get_ref()); Chris@49: const Mat& X = tmp.M; Chris@49: Chris@49: arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" ); Chris@49: Chris@49: Col out(X.n_elem); Chris@49: Chris@49: arrayops::convert( out.memptr(), X.memptr(), out.n_elem ); Chris@49: Chris@49: return out; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: Col Chris@49: conv_to< Col >::from(const Base& in, const typename arma_cx_only::result* junk) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: const unwrap tmp(in.get_ref()); Chris@49: const Mat& X = tmp.M; Chris@49: Chris@49: arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" ); Chris@49: Chris@49: Col out(X.n_rows, X.n_cols); Chris@49: Chris@49: arrayops::convert_cx( out.memptr(), X.memptr(), out.n_elem ); Chris@49: Chris@49: return out; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: Col Chris@49: conv_to< Col >::from(const std::vector& in, const typename arma_not_cx::result* junk) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: const uword N = uword( in.size() ); Chris@49: Chris@49: Col out(N); Chris@49: Chris@49: if(N > 0) Chris@49: { Chris@49: out_eT* out_mem = out.memptr(); Chris@49: const in_eT* in_mem = &(in[0]); Chris@49: Chris@49: for(uword i=0; i Chris@49: template Chris@49: inline Chris@49: Col Chris@49: conv_to< Col >::from(const std::vector& in, const typename arma_cx_only::result* junk) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: Col out( in.size() ); Chris@49: Chris@49: typename std::vector::const_iterator in_begin = in.begin(); Chris@49: typename std::vector::const_iterator in_end = in.end(); Chris@49: Chris@49: typename Col::iterator out_begin = out.begin(); Chris@49: typename Col::iterator out_end = out.end(); Chris@49: Chris@49: typename std::vector::const_iterator in_it; Chris@49: typename Col::iterator out_it; Chris@49: Chris@49: for(in_it = in_begin, out_it = out_begin; (in_it != in_end) && (out_it != out_end); ++in_it, ++out_it) Chris@49: { Chris@49: out_eT& out_elem = (*out_it); Chris@49: const in_eT& in_elem = (*in_it); Chris@49: Chris@49: arrayops::convert_cx_scalar(out_elem, in_elem); Chris@49: } Chris@49: Chris@49: return out; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! conversion to Armadillo cubes from Armadillo BaseCube objects Chris@49: template Chris@49: class conv_to< Cube > Chris@49: { Chris@49: public: Chris@49: Chris@49: template Chris@49: inline static Cube from(const BaseCube& in, const typename arma_not_cx::result* junk = 0); Chris@49: Chris@49: template Chris@49: inline static Cube from(const BaseCube& in, const typename arma_cx_only::result* junk = 0); Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: Cube Chris@49: conv_to< Cube >::from(const BaseCube& in, const typename arma_not_cx::result* junk) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: const unwrap_cube tmp( in.get_ref() ); Chris@49: const Cube& X = tmp.M; Chris@49: Chris@49: Cube out(X.n_rows, X.n_cols, X.n_slices); Chris@49: Chris@49: arrayops::convert( out.memptr(), X.memptr(), out.n_elem ); Chris@49: Chris@49: return out; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: Cube Chris@49: conv_to< Cube >::from(const BaseCube& in, const typename arma_cx_only::result* junk) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: const unwrap_cube tmp( in.get_ref() ); Chris@49: const Cube& X = tmp.M; Chris@49: Chris@49: Cube out(X.n_rows, X.n_cols, X.n_slices); Chris@49: Chris@49: arrayops::convert_cx( out.memptr(), X.memptr(), out.n_elem ); Chris@49: Chris@49: return out; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! conversion to std::vector from Armadillo Base objects Chris@49: template Chris@49: class conv_to< std::vector > Chris@49: { Chris@49: public: Chris@49: Chris@49: template Chris@49: inline static std::vector from(const Base& in, const typename arma_not_cx::result* junk = 0); Chris@49: Chris@49: template Chris@49: inline static std::vector from(const Base& in, const typename arma_cx_only::result* junk = 0); Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: std::vector Chris@49: conv_to< std::vector >::from(const Base& in, const typename arma_not_cx::result* junk) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: const unwrap tmp(in.get_ref()); Chris@49: const Mat& X = tmp.M; Chris@49: Chris@49: arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" ); Chris@49: Chris@49: const uword N = X.n_elem; Chris@49: Chris@49: std::vector out(N); Chris@49: Chris@49: if(N > 0) Chris@49: { Chris@49: out_eT* out_mem = &(out[0]); Chris@49: const in_eT* X_mem = X.memptr(); Chris@49: Chris@49: for(uword i=0; i Chris@49: template Chris@49: inline Chris@49: std::vector Chris@49: conv_to< std::vector >::from(const Base& in, const typename arma_cx_only::result* junk) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: const unwrap tmp(in.get_ref()); Chris@49: const Mat& X = tmp.M; Chris@49: Chris@49: arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" ); Chris@49: Chris@49: std::vector out(X.n_elem); Chris@49: Chris@49: typename Mat::const_iterator X_begin = X.begin(); Chris@49: typename Mat::const_iterator X_end = X.end(); Chris@49: Chris@49: typename std::vector::iterator out_begin = out.begin(); Chris@49: typename std::vector::iterator out_end = out.end(); Chris@49: Chris@49: typename Mat::const_iterator X_it; Chris@49: typename std::vector::iterator out_it; Chris@49: Chris@49: for(X_it = X_begin, out_it = out_begin; (X_it != X_end) && (out_it != out_end); ++X_it, ++out_it) Chris@49: { Chris@49: out_eT& out_elem = (*out_it); Chris@49: const in_eT& X_elem = (*X_it); Chris@49: Chris@49: arrayops::convert_cx_scalar(out_elem, X_elem); Chris@49: } Chris@49: Chris@49: return out; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! @}