Chris@49: // Copyright (C) 2008-2011 NICTA (www.nicta.com.au) Chris@49: // Copyright (C) 2008-2011 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_misc Chris@49: //! @{ Chris@49: Chris@49: Chris@49: Chris@49: //! \brief Chris@49: //! Generate a vector with 'num' elements. Chris@49: //! The values of the elements linearly increase from 'start' upto (and including) 'end'. Chris@49: Chris@49: template Chris@49: inline Chris@49: vec_type Chris@49: linspace Chris@49: ( Chris@49: const typename vec_type::pod_type start, Chris@49: const typename vec_type::pod_type end, Chris@49: const uword num = 100u, Chris@49: const typename arma_Mat_Col_Row_only::result* junk = 0 Chris@49: ) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: typedef typename vec_type::elem_type eT; Chris@49: typedef typename vec_type::pod_type T; Chris@49: Chris@49: vec_type x; Chris@49: Chris@49: if(num >= 2) Chris@49: { Chris@49: x.set_size(num); Chris@49: Chris@49: eT* x_mem = x.memptr(); Chris@49: Chris@49: const uword num_m1 = num - 1; Chris@49: Chris@49: if(is_non_integral::value == true) Chris@49: { Chris@49: const T delta = (end-start)/T(num_m1); Chris@49: Chris@49: for(uword i=0; i= start) ? double(end-start)/double(num_m1) : -double(start-end)/double(num_m1); Chris@49: Chris@49: for(uword i=0; i(start, end, num); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // log_exp_add Chris@49: Chris@49: template Chris@49: inline Chris@49: typename arma_real_only::result Chris@49: log_add_exp(eT log_a, eT log_b) Chris@49: { Chris@49: if(log_a < log_b) Chris@49: { Chris@49: std::swap(log_a, log_b); Chris@49: } Chris@49: Chris@49: const eT negdelta = log_b - log_a; Chris@49: Chris@49: if( (negdelta < Datum::log_min) || (arma_isfinite(negdelta) == false) ) Chris@49: { Chris@49: return log_a; Chris@49: } Chris@49: else Chris@49: { Chris@49: #if defined(ARMA_HAVE_LOG1P) Chris@49: return (log_a + log1p(std::exp(negdelta))); Chris@49: #else Chris@49: return (log_a + std::log(1.0 + std::exp(negdelta))); Chris@49: #endif Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // for compatibility with earlier versions Chris@49: template Chris@49: inline Chris@49: typename arma_real_only::result Chris@49: log_add(eT log_a, eT log_b) Chris@49: { Chris@49: return log_add_exp(log_a, log_b); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: arma_warn_unused Chris@49: bool Chris@49: is_finite(const eT x, const typename arma_scalar_only::result* junk = 0) Chris@49: { Chris@49: arma_ignore(junk); Chris@49: Chris@49: return arma_isfinite(x); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: arma_warn_unused Chris@49: bool Chris@49: is_finite(const Base& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename T1::elem_type eT; Chris@49: Chris@49: const unwrap tmp(X.get_ref()); Chris@49: const Mat& A = tmp.M; Chris@49: Chris@49: return A.is_finite(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: arma_warn_unused Chris@49: bool Chris@49: is_finite(const BaseCube& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename T1::elem_type eT; Chris@49: Chris@49: const unwrap_cube tmp(X.get_ref()); Chris@49: const Cube& A = tmp.M; Chris@49: Chris@49: return A.is_finite(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: Op Chris@49: sympd(const Base& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return Op(X.get_ref()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: swap(Mat& A, Mat& B) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const uword A_mem_state = A.mem_state; Chris@49: Chris@49: if( (A.vec_state == B.vec_state) && (A_mem_state == B.mem_state) && ((A_mem_state == 0) || (A_mem_state == 3)) ) Chris@49: { Chris@49: A.swap(B); Chris@49: } Chris@49: else Chris@49: { Chris@49: if(A.n_elem <= B.n_elem) Chris@49: { Chris@49: Mat C = A; Chris@49: Chris@49: A.steal_mem(B); Chris@49: B.steal_mem(C); Chris@49: } Chris@49: else Chris@49: { Chris@49: Mat C = B; Chris@49: Chris@49: B.steal_mem(A); Chris@49: A.steal_mem(C); Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! @}