Fn_log_det

Functions

template<typename T1 >
void log_det (typename T1::elem_type &out_val, typename T1::pod_type &out_sign, const Base< typename T1::elem_type, T1 > &X, const typename arma_blas_type_only< typename T1::elem_type >::result *junk=0)
 log determinant of mat
template<typename T1 >
void log_det (typename T1::elem_type &out_val, typename T1::pod_type &out_sign, const Op< T1, op_diagmat > &X, const typename arma_blas_type_only< typename T1::elem_type >::result *junk=0)

Function Documentation

template<typename T1 >
void log_det ( typename T1::elem_type &  out_val,
typename T1::pod_type &  out_sign,
const Base< typename T1::elem_type, T1 > &  X,
const typename arma_blas_type_only< typename T1::elem_type >::result *  junk = 0 
) [inline]

log determinant of mat

Definition at line 27 of file fn_log_det.hpp.

References Base< elem_type, derived >::get_ref(), and auxlib::log_det().

00033   {
00034   arma_extra_debug_sigprint();
00035   
00036   typedef typename T1::elem_type eT;
00037   
00038   const unwrap<T1>   tmp(X.get_ref());
00039   const Mat<eT>& A = tmp.M;
00040   
00041   arma_debug_check( !A.is_square(), "log_det(): matrix must be square" );
00042   
00043   auxlib::log_det(out_val, out_sign, A);
00044   }

template<typename T1 >
void log_det ( typename T1::elem_type &  out_val,
typename T1::pod_type &  out_sign,
const Op< T1, op_diagmat > &  X,
const typename arma_blas_type_only< typename T1::elem_type >::result *  junk = 0 
) [inline]

Definition at line 52 of file fn_log_det.hpp.

References log(), Op< T1, op_type >::m, diagmat_proxy< T1 >::n_elem, and access::tmp_real().

00058   {
00059   arma_extra_debug_sigprint();
00060   
00061   typedef typename T1::elem_type eT;
00062   typedef typename T1::pod_type   T;
00063   
00064   const diagmat_proxy<T1> A(X.m);
00065   
00066   const u32 N = A.n_elem;
00067   
00068   arma_debug_check( (N == 0), "log_det(): given matrix has no elements" );
00069   
00070   const eT x = A[0];
00071   
00072   T  sign = (is_complex<eT>::value == false) ? ( (access::tmp_real(x) < T(0)) ? -1 : +1 ) : +1;
00073   eT val  = (is_complex<eT>::value == false) ? std::log( (access::tmp_real(x) < T(0)) ? x*T(-1) : x ) : std::log(x);
00074 
00075   for(u32 i=1; i<N; ++i)
00076     {
00077     const eT x = A[i];
00078     
00079     sign *= (is_complex<eT>::value == false) ? ( (access::tmp_real(x) < T(0)) ? -1 : +1 ) : +1;
00080     val  += (is_complex<eT>::value == false) ? std::log( (access::tmp_real(x) < T(0)) ? x*T(-1) : x ) : std::log(x);
00081     }
00082   
00083   out_val  = val;
00084   out_sign = sign;
00085   }