max@0: // Copyright (C) 2010-2011 NICTA (www.nicta.com.au) max@0: // Copyright (C) 2010-2011 Conrad Sanderson max@0: // max@0: // This file is part of the Armadillo C++ library. max@0: // It is provided without any warranty of fitness max@0: // for any purpose. You can redistribute this file max@0: // and/or modify it under the terms of the GNU max@0: // Lesser General Public License (LGPL) as published max@0: // by the Free Software Foundation, either version 3 max@0: // of the License or (at your option) any later version. max@0: // (see http://www.opensource.org/licenses for more info) max@0: max@0: max@0: //! \addtogroup fn_log_det max@0: //! @{ max@0: max@0: max@0: max@0: //! log determinant of mat max@0: template max@0: inline max@0: bool max@0: log_det max@0: ( max@0: typename T1::elem_type& out_val, max@0: typename T1::pod_type& out_sign, max@0: const Base& X, max@0: const typename arma_blas_type_only::result* junk = 0 max@0: ) max@0: { max@0: arma_extra_debug_sigprint(); max@0: arma_ignore(junk); max@0: max@0: return auxlib::log_det(out_val, out_sign, X); max@0: } max@0: max@0: max@0: max@0: template max@0: inline max@0: void max@0: log_det max@0: ( max@0: typename T1::elem_type& out_val, max@0: typename T1::pod_type& out_sign, max@0: const Op& X, max@0: const typename arma_blas_type_only::result* junk = 0 max@0: ) max@0: { max@0: arma_extra_debug_sigprint(); max@0: arma_ignore(junk); max@0: max@0: typedef typename T1::elem_type eT; max@0: typedef typename T1::pod_type T; max@0: max@0: const diagmat_proxy A(X.m); max@0: max@0: const uword N = A.n_elem; max@0: max@0: if(N == 0) max@0: { max@0: out_val = eT(0); max@0: out_sign = T(1); max@0: max@0: return; max@0: } max@0: max@0: const eT x = A[0]; max@0: max@0: T sign = (is_complex::value == false) ? ( (access::tmp_real(x) < T(0)) ? -1 : +1 ) : +1; max@0: eT val = (is_complex::value == false) ? std::log( (access::tmp_real(x) < T(0)) ? x*T(-1) : x ) : std::log(x); max@0: max@0: for(uword i=1; i::value == false) ? ( (access::tmp_real(x) < T(0)) ? -1 : +1 ) : +1; max@0: val += (is_complex::value == false) ? std::log( (access::tmp_real(x) < T(0)) ? x*T(-1) : x ) : std::log(x); max@0: } max@0: max@0: out_val = val; max@0: out_sign = sign; max@0: } max@0: max@0: max@0: max@0: //! @}