Mercurial > hg > segmenter-vamp-plugin
diff armadillo-2.4.4/include/armadillo_bits/fn_conv_to.hpp @ 0:8b6102e2a9b0
Armadillo Library
author | maxzanoni76 <max.zanoni@eecs.qmul.ac.uk> |
---|---|
date | Wed, 11 Apr 2012 09:27:06 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/armadillo-2.4.4/include/armadillo_bits/fn_conv_to.hpp Wed Apr 11 09:27:06 2012 +0100 @@ -0,0 +1,1102 @@ +// Copyright (C) 2008-2010 NICTA (www.nicta.com.au) +// Copyright (C) 2008-2010 Conrad Sanderson +// +// This file is part of the Armadillo C++ library. +// It is provided without any warranty of fitness +// for any purpose. You can redistribute this file +// and/or modify it under the terms of the GNU +// Lesser General Public License (LGPL) as published +// by the Free Software Foundation, either version 3 +// of the License or (at your option) any later version. +// (see http://www.opensource.org/licenses for more info) + + +//! \addtogroup fn_conv_to +//! @{ + + + +//! conversion from Armadillo Base and BaseCube objects to scalars +//! (kept only for compatibility with old code; use as_scalar() instead for Base objects like Mat) +template<typename out_eT> +class conv_to + { + public: + + template<typename in_eT, typename T1> + inline static out_eT from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0); + + template<typename in_eT, typename T1> + inline static out_eT from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0); + + template<typename in_eT, typename T1> + inline static out_eT from(const BaseCube<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0); + + template<typename in_eT, typename T1> + inline static out_eT from(const BaseCube<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0); + }; + + + +template<typename out_eT> +template<typename in_eT, typename T1> +inline +out_eT +conv_to<out_eT>::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + arma_type_check(( is_supported_elem_type<out_eT>::value == false )); + + const unwrap<T1> tmp(in.get_ref()); + const Mat<in_eT>& X = tmp.M; + + arma_debug_check( (X.n_elem != 1), "conv_to(): given object doesn't have exactly one element" ); + + return out_eT(X.mem[0]); + } + + + +template<typename out_eT> +template<typename in_eT, typename T1> +inline +out_eT +conv_to<out_eT>::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + arma_type_check(( is_supported_elem_type<out_eT>::value == false )); + + const unwrap<T1> tmp(in.get_ref()); + const Mat<in_eT>& X = tmp.M; + + arma_debug_check( (X.n_elem != 1), "conv_to(): given object doesn't have exactly one element" ); + + out_eT out; + + arrayops::convert_cx_scalar(out, X.mem[0]); + + return out; + } + + + +template<typename out_eT> +template<typename in_eT, typename T1> +inline +out_eT +conv_to<out_eT>::from(const BaseCube<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + arma_type_check(( is_supported_elem_type<out_eT>::value == false )); + + const unwrap_cube<T1> tmp(in.get_ref()); + const Cube<in_eT>& X = tmp.M; + + arma_debug_check( (X.n_elem != 1), "conv_to(): given object doesn't have exactly one element" ); + + return out_eT(X.mem[0]); + } + + + +template<typename out_eT> +template<typename in_eT, typename T1> +inline +out_eT +conv_to<out_eT>::from(const BaseCube<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + arma_type_check(( is_supported_elem_type<out_eT>::value == false )); + + const unwrap_cube<T1> tmp(in.get_ref()); + const Cube<in_eT>& X = tmp.M; + + arma_debug_check( (X.n_elem != 1), "conv_to(): given object doesn't have exactly one element" ); + + out_eT out; + + arrayops::convert_cx_scalar(out, X.mem[0]); + + return out; + } + + + +//! conversion to Armadillo matrices from Armadillo Base objects, +//! as well as from std::vector, itpp::Mat and itpp::Vec +template<typename out_eT> +class conv_to< Mat<out_eT> > + { + public: + + template<typename in_eT, typename T1> + inline static Mat<out_eT> from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0); + + template<typename in_eT, typename T1> + inline static Mat<out_eT> from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0); + + + + template<typename in_eT> + inline static Mat<out_eT> from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk = 0); + + template<typename in_eT> + inline static Mat<out_eT> from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk = 0); + + + + template<typename in_eT> + inline static Mat<out_eT> from(const itpp::Mat<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk = 0); + + template<typename in_eT> + inline static Mat<out_eT> from(const itpp::Mat<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk = 0); + + + + template<typename in_eT> + inline static Mat<out_eT> from(const itpp::Vec<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk = 0); + + template<typename in_eT> + inline static Mat<out_eT> from(const itpp::Vec<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk = 0); + }; + + + +template<typename out_eT> +template<typename in_eT, typename T1> +inline +Mat<out_eT> +conv_to< Mat<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + const unwrap<T1> tmp(in.get_ref()); + const Mat<in_eT>& X = tmp.M; + + Mat<out_eT> out(X.n_rows, X.n_cols); + + arrayops::convert( out.memptr(), X.memptr(), out.n_elem ); + + return out; + } + + + +template<typename out_eT> +template<typename in_eT, typename T1> +inline +Mat<out_eT> +conv_to< Mat<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + const unwrap<T1> tmp(in.get_ref()); + const Mat<in_eT>& X = tmp.M; + + Mat<out_eT> out(X.n_rows, X.n_cols); + + arrayops::convert_cx( out.memptr(), X.memptr(), out.n_elem ); + + return out; + } + + + +template<typename out_eT> +template<typename in_eT> +inline +Mat<out_eT> +conv_to< Mat<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + Mat<out_eT> out(in.size(), 1); + + typename std::vector<in_eT>::const_iterator in_begin = in.begin(); + typename std::vector<in_eT>::const_iterator in_end = in.end(); + + typename Mat<out_eT>::iterator out_begin = out.begin(); + typename Mat<out_eT>::iterator out_end = out.end(); + + typename std::vector<in_eT>::const_iterator in_it; + typename Mat<out_eT>::iterator out_it; + + for(in_it = in_begin, out_it = out_begin; (in_it != in_end) && (out_it != out_end); ++in_it, ++out_it) + { + (*out_it) = out_eT(*in_it); + } + + return out; + } + + + +template<typename out_eT> +template<typename in_eT> +inline +Mat<out_eT> +conv_to< Mat<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + Mat<out_eT> out(in.size(), 1); + + typename std::vector<in_eT>::const_iterator in_begin = in.begin(); + typename std::vector<in_eT>::const_iterator in_end = in.end(); + + typename Mat<out_eT>::iterator out_begin = out.begin(); + typename Mat<out_eT>::iterator out_end = out.end(); + + typename std::vector<in_eT>::const_iterator in_it; + typename Mat<out_eT>::iterator out_it; + + for(in_it = in_begin, out_it = out_begin; (in_it != in_end) && (out_it != out_end); ++in_it, ++out_it) + { + out_eT& out_elem = (*out_it); + const in_eT& in_elem = (*in_it); + + arrayops::convert_cx_scalar(out_elem, in_elem); + } + + return out; + } + + + +template<typename out_eT> +template<typename in_eT> +inline +Mat<out_eT> +conv_to< Mat<out_eT> >::from(const itpp::Mat<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + Mat<out_eT> out(in.rows(), in.cols()); + + arrayops::convert( out.memptr(), in._data(), out.n_elem ); + + return out; + } + + + +template<typename out_eT> +template<typename in_eT> +inline +Mat<out_eT> +conv_to< Mat<out_eT> >::from(const itpp::Mat<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + Mat<out_eT> out(in.rows(), in.cols()); + + arrayops::convert_cx( out.memptr(), in._data(), out.n_elem ); + + return out; + } + + + +template<typename out_eT> +template<typename in_eT> +inline +Mat<out_eT> +conv_to< Mat<out_eT> >::from(const itpp::Vec<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + Mat<out_eT> out(in.length(), 1); + + arrayops::convert( out.memptr(), in._data(), out.n_elem ); + + return out; + } + + + +template<typename out_eT> +template<typename in_eT> +inline +Mat<out_eT> +conv_to< Mat<out_eT> >::from(const itpp::Vec<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + Mat<out_eT> out(in.length(), 1); + + arrayops::convert_cx( out.memptr(), in._data(), out.n_elem ); + + return out; + } + + + +//! conversion to Armadillo row vectors from Armadillo Base objects, +//! as well as from std::vector, itpp::Mat and itpp::Vec +template<typename out_eT> +class conv_to< Row<out_eT> > + { + public: + + template<typename in_eT, typename T1> + inline static Row<out_eT> from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0); + + template<typename in_eT, typename T1> + inline static Row<out_eT> from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0); + + + + template<typename in_eT> + inline static Row<out_eT> from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk = 0); + + template<typename in_eT> + inline static Row<out_eT> from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk = 0); + + + + template<typename in_eT> + inline static Row<out_eT> from(const itpp::Mat<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk = 0); + + template<typename in_eT> + inline static Row<out_eT> from(const itpp::Mat<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk = 0); + + + + template<typename in_eT> + inline static Row<out_eT> from(const itpp::Vec<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk = 0); + + template<typename in_eT> + inline static Row<out_eT> from(const itpp::Vec<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk = 0); + }; + + + +template<typename out_eT> +template<typename in_eT, typename T1> +inline +Row<out_eT> +conv_to< Row<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + const unwrap<T1> tmp(in.get_ref()); + const Mat<in_eT>& X = tmp.M; + + arma_debug_check( (X.is_vec() == false), "conv_to(): given object can't be interpreted as a vector" ); + + Row<out_eT> out(X.n_elem); + + arrayops::convert( out.memptr(), X.memptr(), out.n_elem ); + + return out; + } + + + +template<typename out_eT> +template<typename in_eT, typename T1> +inline +Row<out_eT> +conv_to< Row<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + const unwrap<T1> tmp(in.get_ref()); + const Mat<in_eT>& X = tmp.M; + + arma_debug_check( (X.is_vec() == false), "conv_to(): given object can't be interpreted as a vector" ); + + Row<out_eT> out(X.n_rows, X.n_cols); + + arrayops::convert_cx( out.memptr(), X.memptr(), out.n_elem ); + + return out; + } + + + +template<typename out_eT> +template<typename in_eT> +inline +Row<out_eT> +conv_to< Row<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + Row<out_eT> out( in.size() ); + + typename std::vector<in_eT>::const_iterator in_begin = in.begin(); + typename std::vector<in_eT>::const_iterator in_end = in.end(); + + typename Row<out_eT>::iterator out_begin = out.begin(); + typename Row<out_eT>::iterator out_end = out.end(); + + typename std::vector<in_eT>::const_iterator in_it; + typename Row<out_eT>::iterator out_it; + + for(in_it = in_begin, out_it = out_begin; (in_it != in_end) && (out_it != out_end); ++in_it, ++out_it) + { + (*out_it) = out_eT(*in_it); + } + + return out; + } + + + +template<typename out_eT> +template<typename in_eT> +inline +Row<out_eT> +conv_to< Row<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + Row<out_eT> out( in.size() ); + + typename std::vector<in_eT>::const_iterator in_begin = in.begin(); + typename std::vector<in_eT>::const_iterator in_end = in.end(); + + typename Row<out_eT>::iterator out_begin = out.begin(); + typename Row<out_eT>::iterator out_end = out.end(); + + typename std::vector<in_eT>::const_iterator in_it; + typename Row<out_eT>::iterator out_it; + + for(in_it = in_begin, out_it = out_begin; (in_it != in_end) && (out_it != out_end); ++in_it, ++out_it) + { + out_eT& out_elem = (*out_it); + const in_eT& in_elem = (*in_it); + + arrayops::convert_cx_scalar(out_elem, in_elem); + } + + return out; + } + + + +template<typename out_eT> +template<typename in_eT> +inline +Row<out_eT> +conv_to< Row<out_eT> >::from(const itpp::Mat<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + const bool is_vec = ( (in.rows() == 1) || (in.cols() == 1) ); + + arma_debug_check( (is_vec == false), "conv_to(): given object can't be interpreted as a vector" ); + + Row<out_eT> out(in.rows() * in.cols()); + + arrayops::convert( out.memptr(), in._data(), out.n_elem ); + + return out; + } + + + +template<typename out_eT> +template<typename in_eT> +inline +Row<out_eT> +conv_to< Row<out_eT> >::from(const itpp::Mat<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + //const bool is_vec = ( (in.rows() == 1) || (in.cols() == 1) ); + + Row<out_eT> out(in.rows() * in.cols()); + + arrayops::convert_cx( out.memptr(), in._data(), out.n_elem ); + + return out; + } + + + +template<typename out_eT> +template<typename in_eT> +inline +Row<out_eT> +conv_to< Row<out_eT> >::from(const itpp::Vec<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + Row<out_eT> out(in.length()); + + arrayops::convert( out.memptr(), in._data(), out.n_elem ); + + return out; + } + + + +template<typename out_eT> +template<typename in_eT> +inline +Row<out_eT> +conv_to< Row<out_eT> >::from(const itpp::Vec<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + Row<out_eT> out(in.length()); + + arrayops::convert_cx( out.memptr(), in._data(), out.n_elem ); + + return out; + } + + + +//! conversion to Armadillo column vectors from Armadillo Base objects, +//! as well as from std::vector, itpp::Mat and itpp::Vec +template<typename out_eT> +class conv_to< Col<out_eT> > + { + public: + + template<typename in_eT, typename T1> + inline static Col<out_eT> from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0); + + template<typename in_eT, typename T1> + inline static Col<out_eT> from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0); + + + + template<typename in_eT> + inline static Col<out_eT> from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk = 0); + + template<typename in_eT> + inline static Col<out_eT> from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk = 0); + + + + template<typename in_eT> + inline static Col<out_eT> from(const itpp::Mat<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk = 0); + + template<typename in_eT> + inline static Col<out_eT> from(const itpp::Mat<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk = 0); + + + + template<typename in_eT> + inline static Col<out_eT> from(const itpp::Vec<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk = 0); + + template<typename in_eT> + inline static Col<out_eT> from(const itpp::Vec<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk = 0); + }; + + + +template<typename out_eT> +template<typename in_eT, typename T1> +inline +Col<out_eT> +conv_to< Col<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + const unwrap<T1> tmp(in.get_ref()); + const Mat<in_eT>& X = tmp.M; + + arma_debug_check( (X.is_vec() == false), "conv_to(): given object can't be interpreted as a vector" ); + + Col<out_eT> out(X.n_elem); + + arrayops::convert( out.memptr(), X.memptr(), out.n_elem ); + + return out; + } + + + +template<typename out_eT> +template<typename in_eT, typename T1> +inline +Col<out_eT> +conv_to< Col<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + const unwrap<T1> tmp(in.get_ref()); + const Mat<in_eT>& X = tmp.M; + + arma_debug_check( (X.is_vec() == false), "conv_to(): given object can't be interpreted as a vector" ); + + Col<out_eT> out(X.n_rows, X.n_cols); + + arrayops::convert_cx( out.memptr(), X.memptr(), out.n_elem ); + + return out; + } + + + +template<typename out_eT> +template<typename in_eT> +inline +Col<out_eT> +conv_to< Col<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + Col<out_eT> out( in.size() ); + + typename std::vector<in_eT>::const_iterator in_begin = in.begin(); + typename std::vector<in_eT>::const_iterator in_end = in.end(); + + typename Col<out_eT>::iterator out_begin = out.begin(); + typename Col<out_eT>::iterator out_end = out.end(); + + typename std::vector<in_eT>::const_iterator in_it; + typename Col<out_eT>::iterator out_it; + + for(in_it = in_begin, out_it = out_begin; (in_it != in_end) && (out_it != out_end); ++in_it, ++out_it) + { + (*out_it) = out_eT(*in_it); + } + + return out; + } + + + +template<typename out_eT> +template<typename in_eT> +inline +Col<out_eT> +conv_to< Col<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + Col<out_eT> out( in.size() ); + + typename std::vector<in_eT>::const_iterator in_begin = in.begin(); + typename std::vector<in_eT>::const_iterator in_end = in.end(); + + typename Col<out_eT>::iterator out_begin = out.begin(); + typename Col<out_eT>::iterator out_end = out.end(); + + typename std::vector<in_eT>::const_iterator in_it; + typename Col<out_eT>::iterator out_it; + + for(in_it = in_begin, out_it = out_begin; (in_it != in_end) && (out_it != out_end); ++in_it, ++out_it) + { + out_eT& out_elem = (*out_it); + const in_eT& in_elem = (*in_it); + + arrayops::convert_cx_scalar(out_elem, in_elem); + } + + return out; + } + + + +template<typename out_eT> +template<typename in_eT> +inline +Col<out_eT> +conv_to< Col<out_eT> >::from(const itpp::Mat<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + const bool is_vec = ( (in.rows() == 1) || (in.cols() == 1) ); + + arma_debug_check( (is_vec == false), "conv_to(): given object can't be interpreted as a vector" ); + + Col<out_eT> out(in.rows() * in.cols()); + + arrayops::convert( out.memptr(), in._data(), out.n_elem ); + + return out; + } + + + +template<typename out_eT> +template<typename in_eT> +inline +Col<out_eT> +conv_to< Col<out_eT> >::from(const itpp::Mat<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + //const bool is_vec = ( (in.rows() == 1) || (in.cols() == 1) ); + + Col<out_eT> out(in.rows() * in.cols()); + + arrayops::convert_cx( out.memptr(), in._data(), out.n_elem ); + + return out; + } + + + +template<typename out_eT> +template<typename in_eT> +inline +Col<out_eT> +conv_to< Col<out_eT> >::from(const itpp::Vec<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + Col<out_eT> out( in.length() ); + + arrayops::convert( out.memptr(), in._data(), out.n_elem ); + + return out; + } + + + +template<typename out_eT> +template<typename in_eT> +inline +Col<out_eT> +conv_to< Col<out_eT> >::from(const itpp::Vec<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + Col<out_eT> out( in.length() ); + + arrayops::convert_cx( out.memptr(), in._data(), out.n_elem ); + + return out; + } + + + +//! conversion to Armadillo cubes from Armadillo BaseCube objects +template<typename out_eT> +class conv_to< Cube<out_eT> > + { + public: + + template<typename in_eT, typename T1> + inline static Cube<out_eT> from(const BaseCube<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0); + + template<typename in_eT, typename T1> + inline static Cube<out_eT> from(const BaseCube<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0); + }; + + + +template<typename out_eT> +template<typename in_eT, typename T1> +inline +Cube<out_eT> +conv_to< Cube<out_eT> >::from(const BaseCube<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + const unwrap_cube<T1> tmp( in.get_ref() ); + const Cube<in_eT>& X = tmp.M; + + Cube<out_eT> out(X.n_rows, X.n_cols, X.n_slices); + + arrayops::convert( out.memptr(), X.memptr(), out.n_elem ); + + return out; + } + + + +template<typename out_eT> +template<typename in_eT, typename T1> +inline +Cube<out_eT> +conv_to< Cube<out_eT> >::from(const BaseCube<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + const unwrap_cube<T1> tmp( in.get_ref() ); + const Cube<in_eT>& X = tmp.M; + + Cube<out_eT> out(X.n_rows, X.n_cols, X.n_slices); + + arrayops::convert_cx( out.memptr(), X.memptr(), out.n_elem ); + + return out; + } + + + +//! conversion to std::vector from Armadillo Base objects +template<typename out_eT> +class conv_to< std::vector<out_eT> > + { + public: + + template<typename in_eT, typename T1> + inline static std::vector<out_eT> from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0); + + template<typename in_eT, typename T1> + inline static std::vector<out_eT> from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0); + }; + + + +template<typename out_eT> +template<typename in_eT, typename T1> +inline +std::vector<out_eT> +conv_to< std::vector<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + const unwrap<T1> tmp(in.get_ref()); + const Mat<in_eT>& X = tmp.M; + + arma_debug_check( (X.is_vec() == false), "conv_to(): given object can't be interpreted as a vector" ); + + std::vector<out_eT> out(X.n_elem); + + typename Mat<in_eT>::const_iterator X_begin = X.begin(); + typename Mat<in_eT>::const_iterator X_end = X.end(); + + typename std::vector<out_eT>::iterator out_begin = out.begin(); + typename std::vector<out_eT>::iterator out_end = out.end(); + + typename Mat<in_eT>::const_iterator X_it; + typename std::vector<out_eT>::iterator out_it; + + for(X_it = X_begin, out_it = out_begin; (X_it != X_end) && (out_it != out_end); ++X_it, ++out_it) + { + (*out_it) = out_eT(*X_it); + } + + return out; + } + + + +template<typename out_eT> +template<typename in_eT, typename T1> +inline +std::vector<out_eT> +conv_to< std::vector<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + const unwrap<T1> tmp(in.get_ref()); + const Mat<in_eT>& X = tmp.M; + + arma_debug_check( (X.is_vec() == false), "conv_to(): given object can't be interpreted as a vector" ); + + std::vector<out_eT> out(X.n_elem); + + typename Mat<in_eT>::const_iterator X_begin = X.begin(); + typename Mat<in_eT>::const_iterator X_end = X.end(); + + typename std::vector<out_eT>::iterator out_begin = out.begin(); + typename std::vector<out_eT>::iterator out_end = out.end(); + + typename Mat<in_eT>::const_iterator X_it; + typename std::vector<out_eT>::iterator out_it; + + for(X_it = X_begin, out_it = out_begin; (X_it != X_end) && (out_it != out_end); ++X_it, ++out_it) + { + out_eT& out_elem = (*out_it); + const in_eT& X_elem = (*X_it); + + arrayops::convert_cx_scalar(out_elem, X_elem); + } + + return out; + } + + + +//! conversion to itpp::Mat from Armadillo Base objects +template<typename out_eT> +class conv_to< itpp::Mat<out_eT> > + { + public: + + template<typename in_eT, typename T1> + inline static itpp::Mat<out_eT> from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0); + + template<typename in_eT, typename T1> + inline static itpp::Mat<out_eT> from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0); + }; + + + +template<typename out_eT> +template<typename in_eT, typename T1> +inline +itpp::Mat<out_eT> +conv_to< itpp::Mat<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + const unwrap<T1> tmp( in.get_ref() ); + const Mat<in_eT>& X = tmp.M; + + itpp::Mat<out_eT> out(X.n_rows, X.n_cols); + + arrayops::convert( out._data(), X.memptr(), X.n_elem ); + + return out; + } + + + +template<typename out_eT> +template<typename in_eT, typename T1> +inline +itpp::Mat<out_eT> +conv_to< itpp::Mat<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + const unwrap<T1> tmp( in.get_ref() ); + const Mat<in_eT>& X = tmp.M; + + itpp::Mat<out_eT> out(X.n_rows, X.n_cols); + + arrayops::convert_cx( out._data(), X.memptr(), X.n_elem ); + + return out; + } + + + + +//! conversion to itpp::Vec from Armadillo Base objects +template<typename out_eT> +class conv_to< itpp::Vec<out_eT> > + { + public: + + template<typename in_eT, typename T1> + inline static itpp::Vec<out_eT> from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0); + + template<typename in_eT, typename T1> + inline static itpp::Vec<out_eT> from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0); + }; + + + +template<typename out_eT> +template<typename in_eT, typename T1> +inline +itpp::Vec<out_eT> +conv_to< itpp::Vec<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + const unwrap<T1> tmp( in.get_ref() ); + const Mat<in_eT>& X = tmp.M; + + arma_debug_check( (X.is_vec() == false), "conv_to(): given object can't be interpreted as a vector" ); + + itpp::Vec<out_eT> out(X.n_elem); + + arrayops::convert( out._data(), X.memptr(), X.n_elem ); + + return out; + } + + + +template<typename out_eT> +template<typename in_eT, typename T1> +inline +itpp::Vec<out_eT> +conv_to< itpp::Vec<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk) + { + arma_extra_debug_sigprint(); + + arma_ignore(junk); + + const unwrap<T1> tmp( in.get_ref() ); + const Mat<in_eT>& X = tmp.M; + + itpp::Vec<out_eT> out(X.n_elem); + + arrayops::convert_cx( out._data(), X.memptr(), X.n_elem ); + + return out; + } + + + +//! @}