Files
armadillo-code/include/armadillo_bits/fn_conv_to.hpp
T

960 lines
24 KiB
C++

// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ------------------------------------------------------------------------
//! \addtogroup fn_conv_to
//! @{
//! conversion from Armadillo Base and BaseCube objects to scalars
//! NOTE: use as_scalar() instead; this functionality is kept only for compatibility with old user code
template<typename out_eT>
class conv_to
{
public:
template<typename in_eT>
arma_frown("replace conv_to<...>::from(X) with as_scalar(X)") inline static out_eT from(const in_eT& in, const typename arma_scalar_only<in_eT>::result* junk = nullptr);
template<typename in_eT, typename T1>
arma_frown("replace conv_to<...>::from(X) with as_scalar(X)") inline static out_eT from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = nullptr);
template<typename in_eT, typename T1>
arma_frown("replace conv_to<...>::from(X) with as_scalar(X)") inline static out_eT from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = nullptr);
template<typename in_eT, typename T1>
arma_frown("replace conv_to<...>::from(X) with as_scalar(X)") inline static out_eT from(const BaseCube<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = nullptr);
template<typename in_eT, typename T1>
arma_frown("replace conv_to<...>::from(X) with as_scalar(X)") inline static out_eT from(const BaseCube<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = nullptr);
};
template<typename out_eT>
template<typename in_eT>
arma_warn_unused
inline
out_eT
conv_to<out_eT>::from(const in_eT& in, const typename arma_scalar_only<in_eT>::result* junk)
{
arma_debug_sigprint();
arma_ignore(junk);
arma_type_check(( is_supported_elem_type<out_eT>::value == false ));
// NOTE: this is meant only as a workaround for old user code;
// NOTE: it doesn't handle conversions from complex to real
return out_eT(in);
}
template<typename out_eT>
template<typename in_eT, typename T1>
arma_warn_unused
inline
out_eT
conv_to<out_eT>::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)
{
arma_debug_sigprint();
arma_ignore(junk);
arma_type_check(( is_supported_elem_type<out_eT>::value == false ));
const Proxy<T1> P(in.get_ref());
arma_conform_check( (P.get_n_elem() != 1), "conv_to(): expected 1x1 matrix" );
return out_eT(Proxy<T1>::use_at ? P.at(0,0) : P[0]);
}
template<typename out_eT>
template<typename in_eT, typename T1>
arma_warn_unused
inline
out_eT
conv_to<out_eT>::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)
{
arma_debug_sigprint();
arma_ignore(junk);
arma_type_check(( is_supported_elem_type<out_eT>::value == false ));
const Proxy<T1> P(in.get_ref());
arma_conform_check( (P.get_n_elem() != 1), "conv_to(): expected 1x1 matrix" );
out_eT out;
arrayops::convert_cx_scalar(out, (Proxy<T1>::use_at ? P.at(0,0) : P[0]));
return out;
}
template<typename out_eT>
template<typename in_eT, typename T1>
arma_warn_unused
inline
out_eT
conv_to<out_eT>::from(const BaseCube<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)
{
arma_debug_sigprint();
arma_ignore(junk);
arma_type_check(( is_supported_elem_type<out_eT>::value == false ));
const ProxyCube<T1> P(in.get_ref());
arma_conform_check( (P.get_n_elem() != 1), "conv_to(): expected 1x1x1 cube" );
return out_eT(ProxyCube<T1>::use_at ? P.at(0,0,0) : P[0]);
}
template<typename out_eT>
template<typename in_eT, typename T1>
arma_warn_unused
inline
out_eT
conv_to<out_eT>::from(const BaseCube<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)
{
arma_debug_sigprint();
arma_ignore(junk);
arma_type_check(( is_supported_elem_type<out_eT>::value == false ));
const ProxyCube<T1> P(in.get_ref());
arma_conform_check( (P.get_n_elem() != 1), "conv_to(): expected 1x1x1 cube" );
out_eT out;
arrayops::convert_cx_scalar(out, (ProxyCube<T1>::use_at ? P.at(0,0,0) : P[0]));
return out;
}
//! conversion to Armadillo matrices from Armadillo Base objects, as well as from std::vector
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 = nullptr);
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 = nullptr);
//
template<typename in_eT, typename T1>
inline static Mat<out_eT> from(const SpBase<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = nullptr);
template<typename in_eT, typename T1>
inline static Mat<out_eT> from(const SpBase<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = nullptr);
//
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 = nullptr);
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 = nullptr);
};
template<typename out_eT>
template<typename in_eT, typename T1>
arma_warn_unused
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_debug_sigprint();
arma_ignore(junk);
const quasi_unwrap<T1> tmp(in.get_ref());
const Mat<in_eT>& X = tmp.M;
Mat<out_eT> out(X.n_rows, X.n_cols, arma_nozeros_indicator());
arrayops::convert( out.memptr(), X.memptr(), X.n_elem );
return out;
}
template<typename out_eT>
template<typename in_eT, typename T1>
arma_warn_unused
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_debug_sigprint();
arma_ignore(junk);
const quasi_unwrap<T1> tmp(in.get_ref());
const Mat<in_eT>& X = tmp.M;
Mat<out_eT> out(X.n_rows, X.n_cols, arma_nozeros_indicator());
arrayops::convert_cx( out.memptr(), X.memptr(), X.n_elem );
return out;
}
template<typename out_eT>
template<typename in_eT, typename T1>
arma_warn_unused
inline
Mat<out_eT>
conv_to< Mat<out_eT> >::from(const SpBase<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)
{
arma_debug_sigprint();
arma_ignore(junk);
const unwrap_spmat<T1> U(in.get_ref());
const SpMat<in_eT>& X = U.M;
Mat<out_eT> out(X.n_rows, X.n_cols, arma_zeros_indicator());
podarray<out_eT> tmp(X.n_nonzero);
arrayops::convert( tmp.memptr(), X.values, X.n_nonzero );
typename SpMat<in_eT>::const_iterator it = X.begin();
typename SpMat<in_eT>::const_iterator it_end = X.end();
for(uword count=0; it != it_end; ++it, ++count) { out.at(it.row(), it.col()) = tmp[count]; }
return out;
}
template<typename out_eT>
template<typename in_eT, typename T1>
arma_warn_unused
inline
Mat<out_eT>
conv_to< Mat<out_eT> >::from(const SpBase<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)
{
arma_debug_sigprint();
arma_ignore(junk);
const unwrap_spmat<T1> U(in.get_ref());
const SpMat<in_eT>& X = U.M;
Mat<out_eT> out(X.n_rows, X.n_cols, arma_zeros_indicator());
podarray<out_eT> tmp(X.n_nonzero);
arrayops::convert_cx( tmp.memptr(), X.values, X.n_nonzero );
typename SpMat<in_eT>::const_iterator it = X.begin();
typename SpMat<in_eT>::const_iterator it_end = X.end();
for(uword count=0; it != it_end; ++it, ++count) { out.at(it.row(), it.col()) = tmp[count]; }
return out;
}
template<typename out_eT>
template<typename in_eT>
arma_warn_unused
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_debug_sigprint();
arma_ignore(junk);
const uword N = uword( in.size() );
Mat<out_eT> out(N, 1, arma_nozeros_indicator());
if(N > 0)
{
arrayops::convert( out.memptr(), &(in[0]), N );
}
return out;
}
template<typename out_eT>
template<typename in_eT>
arma_warn_unused
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_debug_sigprint();
arma_ignore(junk);
const uword N = uword( in.size() );
Mat<out_eT> out(N, 1, arma_nozeros_indicator());
if(N > 0)
{
arrayops::convert_cx( out.memptr(), &(in[0]), N );
}
return out;
}
//! conversion to Armadillo row vectors from Armadillo Base objects, as well as from std::vector
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 = nullptr);
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 = nullptr);
//
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 = nullptr);
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 = nullptr);
};
template<typename out_eT>
template<typename in_eT, typename T1>
arma_warn_unused
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_debug_sigprint();
arma_ignore(junk);
const quasi_unwrap<T1> tmp(in.get_ref());
const Mat<in_eT>& X = tmp.M;
arma_conform_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object cannot be interpreted as a vector" );
Row<out_eT> out(X.n_elem, arma_nozeros_indicator());
arrayops::convert( out.memptr(), X.memptr(), X.n_elem );
return out;
}
template<typename out_eT>
template<typename in_eT, typename T1>
arma_warn_unused
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_debug_sigprint();
arma_ignore(junk);
const quasi_unwrap<T1> tmp(in.get_ref());
const Mat<in_eT>& X = tmp.M;
arma_conform_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object cannot be interpreted as a vector" );
Row<out_eT> out(X.n_rows, X.n_cols, arma_nozeros_indicator());
arrayops::convert_cx( out.memptr(), X.memptr(), X.n_elem );
return out;
}
template<typename out_eT>
template<typename in_eT>
arma_warn_unused
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_debug_sigprint();
arma_ignore(junk);
const uword N = uword( in.size() );
Row<out_eT> out(N, arma_nozeros_indicator());
if(N > 0)
{
arrayops::convert( out.memptr(), &(in[0]), N );
}
return out;
}
template<typename out_eT>
template<typename in_eT>
arma_warn_unused
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_debug_sigprint();
arma_ignore(junk);
const uword N = uword( in.size() );
Row<out_eT> out(N, arma_nozeros_indicator());
if(N > 0)
{
arrayops::convert_cx( out.memptr(), &(in[0]), N );
}
return out;
}
//! conversion to Armadillo column vectors from Armadillo Base objects, as well as from std::vector
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 = nullptr);
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 = nullptr);
//
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 = nullptr);
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 = nullptr);
};
template<typename out_eT>
template<typename in_eT, typename T1>
arma_warn_unused
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_debug_sigprint();
arma_ignore(junk);
const quasi_unwrap<T1> tmp(in.get_ref());
const Mat<in_eT>& X = tmp.M;
arma_conform_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object cannot be interpreted as a vector" );
Col<out_eT> out(X.n_elem, arma_nozeros_indicator());
arrayops::convert( out.memptr(), X.memptr(), X.n_elem );
return out;
}
template<typename out_eT>
template<typename in_eT, typename T1>
arma_warn_unused
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_debug_sigprint();
arma_ignore(junk);
const quasi_unwrap<T1> tmp(in.get_ref());
const Mat<in_eT>& X = tmp.M;
arma_conform_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object cannot be interpreted as a vector" );
Col<out_eT> out(X.n_rows, X.n_cols, arma_nozeros_indicator());
arrayops::convert_cx( out.memptr(), X.memptr(), X.n_elem );
return out;
}
template<typename out_eT>
template<typename in_eT>
arma_warn_unused
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_debug_sigprint();
arma_ignore(junk);
const uword N = uword( in.size() );
Col<out_eT> out(N, arma_nozeros_indicator());
if(N > 0)
{
arrayops::convert( out.memptr(), &(in[0]), N );
}
return out;
}
template<typename out_eT>
template<typename in_eT>
arma_warn_unused
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_debug_sigprint();
arma_ignore(junk);
const uword N = uword( in.size() );
Col<out_eT> out(N, arma_nozeros_indicator());
if(N > 0)
{
arrayops::convert_cx( out.memptr(), &(in[0]), N );
}
return out;
}
//! convert between SpMat types
template<typename out_eT>
class conv_to< SpMat<out_eT> >
{
public:
template<typename in_eT, typename T1>
inline static SpMat<out_eT> from(const SpBase<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = nullptr);
template<typename in_eT, typename T1>
inline static SpMat<out_eT> from(const SpBase<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = nullptr);
//
template<typename in_eT, typename T1>
inline static SpMat<out_eT> from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = nullptr);
template<typename in_eT, typename T1>
inline static SpMat<out_eT> from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = nullptr);
};
template<typename out_eT>
template<typename in_eT, typename T1>
arma_warn_unused
inline
SpMat<out_eT>
conv_to< SpMat<out_eT> >::from(const SpBase<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)
{
arma_debug_sigprint();
arma_ignore(junk);
const unwrap_spmat<T1> tmp(in.get_ref());
const SpMat<in_eT>& X = tmp.M;
SpMat<out_eT> out(arma_layout_indicator(), X);
arrayops::convert( access::rwp(out.values), X.values, X.n_nonzero );
out.remove_zeros();
return out;
}
template<typename out_eT>
template<typename in_eT, typename T1>
arma_warn_unused
inline
SpMat<out_eT>
conv_to< SpMat<out_eT> >::from(const SpBase<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)
{
arma_debug_sigprint();
arma_ignore(junk);
const unwrap_spmat<T1> tmp(in.get_ref());
const SpMat<in_eT>& X = tmp.M;
SpMat<out_eT> out(arma_layout_indicator(), X);
arrayops::convert_cx( access::rwp(out.values), X.values, X.n_nonzero );
out.remove_zeros();
return out;
}
template<typename out_eT>
template<typename in_eT, typename T1>
arma_warn_unused
inline
SpMat<out_eT>
conv_to< SpMat<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)
{
arma_debug_sigprint();
arma_ignore(junk);
SpMat<out_eT> out;
const quasi_unwrap<T1> U(in.get_ref());
const Mat<in_eT>& X = U.M;
if(is_same_type<out_eT,in_eT>::yes)
{
const Mat<out_eT>& Y = reinterpret_cast<const Mat<out_eT>&>(X);
SpMat<out_eT> tmp(Y);
out.steal_mem(tmp);
}
else
{
const uword X_n_rows = X.n_rows;
const uword X_n_cols = X.n_cols;
const uword X_n_elem = X.n_elem;
const in_eT* X_mem = X.memptr();
uword X_nnz = 0;
for(uword i=0; i < X_n_elem; ++i) { X_nnz += (X_mem[i] != in_eT(0)) ? uword(1) : uword(0); }
podarray< in_eT> X_nonzeros(X_nnz);
podarray<out_eT> Y_nonzeros(X_nnz);
for(uword i=0,count=0; i < X_n_elem; ++i)
{
const in_eT X_val = X_mem[i];
if(X_val != in_eT(0)) { X_nonzeros[count] = X_val; ++count; }
}
arrayops::convert( Y_nonzeros.memptr(), X_nonzeros.memptr(), X_nnz );
if(X_nnz == 0)
{
out.set_size(X_n_rows, X.n_cols);
}
else
{
SpMat<out_eT> tmp(arma_reserve_indicator(), X_n_rows, X_n_cols, X_nnz);
uword count = 0;
for(uword c=0; c < X_n_cols; ++c)
for(uword r=0; r < X_n_rows; ++r)
{
const in_eT X_val = (*X_mem); ++X_mem;
if(X_val != in_eT(0))
{
access::rw(tmp.values[count]) = Y_nonzeros[count];
access::rw(tmp.row_indices[count]) = r;
access::rw(tmp.col_ptrs[c + 1])++;
++count;
}
}
// Sum column counts to be column pointers.
for(uword c=1; c <= tmp.n_cols; ++c)
{
access::rw(tmp.col_ptrs[c]) += tmp.col_ptrs[c - 1];
}
tmp.remove_zeros(); // in case conversion resulted in an element equal to zero
out.steal_mem(tmp);
}
}
return out;
}
template<typename out_eT>
template<typename in_eT, typename T1>
arma_warn_unused
inline
SpMat<out_eT>
conv_to< SpMat<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)
{
arma_debug_sigprint();
arma_ignore(junk);
SpMat<out_eT> out;
const quasi_unwrap<T1> U(in.get_ref());
const Mat<in_eT>& X = U.M;
if(is_same_type<out_eT,in_eT>::yes)
{
const Mat<out_eT>& Y = reinterpret_cast<const Mat<out_eT>&>(X);
SpMat<out_eT> tmp(Y);
out.steal_mem(tmp);
}
else
{
const uword X_n_rows = X.n_rows;
const uword X_n_cols = X.n_cols;
const uword X_n_elem = X.n_elem;
const in_eT* X_mem = X.memptr();
uword X_nnz = 0;
for(uword i=0; i < X_n_elem; ++i) { X_nnz += (X_mem[i] != in_eT(0)) ? uword(1) : uword(0); }
podarray< in_eT> X_nonzeros(X_nnz);
podarray<out_eT> Y_nonzeros(X_nnz);
for(uword i=0,count=0; i < X_n_elem; ++i)
{
const in_eT X_val = X_mem[i];
if(X_val != in_eT(0)) { X_nonzeros[count] = X_val; ++count; }
}
arrayops::convert_cx( Y_nonzeros.memptr(), X_nonzeros.memptr(), X_nnz );
if(X_nnz == 0)
{
out.set_size(X_n_rows, X.n_cols);
}
else
{
SpMat<out_eT> tmp(arma_reserve_indicator(), X_n_rows, X_n_cols, X_nnz);
uword count = 0;
for(uword c=0; c < X_n_cols; ++c)
for(uword r=0; r < X_n_rows; ++r)
{
const in_eT X_val = (*X_mem); ++X_mem;
if(X_val != in_eT(0))
{
access::rw(tmp.values[count]) = Y_nonzeros[count];
access::rw(tmp.row_indices[count]) = r;
access::rw(tmp.col_ptrs[c + 1])++;
++count;
}
}
// Sum column counts to be column pointers.
for(uword c=1; c <= tmp.n_cols; ++c)
{
access::rw(tmp.col_ptrs[c]) += tmp.col_ptrs[c - 1];
}
tmp.remove_zeros(); // in case conversion resulted in an element equal to zero
out.steal_mem(tmp);
}
}
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 = nullptr);
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 = nullptr);
};
template<typename out_eT>
template<typename in_eT, typename T1>
arma_warn_unused
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_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, arma_nozeros_indicator());
arrayops::convert( out.memptr(), X.memptr(), X.n_elem );
return out;
}
template<typename out_eT>
template<typename in_eT, typename T1>
arma_warn_unused
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_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, arma_nozeros_indicator());
arrayops::convert_cx( out.memptr(), X.memptr(), X.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 = nullptr);
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 = nullptr);
};
template<typename out_eT>
template<typename in_eT, typename T1>
arma_warn_unused
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_debug_sigprint();
arma_ignore(junk);
const quasi_unwrap<T1> tmp(in.get_ref());
const Mat<in_eT>& X = tmp.M;
arma_conform_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object cannot be interpreted as a vector" );
const uword N = X.n_elem;
std::vector<out_eT> out(N);
if(N > 0)
{
arrayops::convert( &(out[0]), X.memptr(), N );
}
return out;
}
template<typename out_eT>
template<typename in_eT, typename T1>
arma_warn_unused
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_debug_sigprint();
arma_ignore(junk);
const quasi_unwrap<T1> tmp(in.get_ref());
const Mat<in_eT>& X = tmp.M;
arma_conform_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object cannot be interpreted as a vector" );
const uword N = X.n_elem;
std::vector<out_eT> out(N);
if(N > 0)
{
arrayops::convert_cx( &(out[0]), X.memptr(), N );
}
return out;
}
//! @}