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)
 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)

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 
) [inline]

log determinant of mat

Definition at line 26 of file fn_log_det.hpp.

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

00027   {
00028   arma_extra_debug_sigprint();
00029   
00030   typedef typename T1::elem_type eT;
00031   
00032   const unwrap<T1>   tmp(X.get_ref());
00033   const Mat<eT>& A = tmp.M;
00034   
00035   arma_debug_check( !A.is_square(), "log_det(): matrix must be square" );
00036   
00037   auxlib::log_det(out_val, out_sign, A);
00038   }

template<typename T1 >
void log_det ( typename T1::elem_type &  out_val,
typename T1::pod_type &  out_sign,
const Op< T1, op_diagmat > &  X 
) [inline]

Definition at line 45 of file fn_log_det.hpp.

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

00046   {
00047   arma_extra_debug_sigprint();
00048   
00049   typedef typename T1::elem_type eT;
00050   typedef typename T1::pod_type   T;
00051   
00052   const diagmat_proxy<T1> A(X.m);
00053   
00054   const u32 N = A.n_elem;
00055   
00056   arma_debug_check( (N == 0), "log_det(): given matrix has no elements" );
00057   
00058   const eT x = A[0];
00059   
00060   T  sign = (is_complex<eT>::value == false) ? ( (access::tmp_real(x) < T(0)) ? -1 : +1 ) : +1;
00061   eT val  = (is_complex<eT>::value == false) ? std::log( (access::tmp_real(x) < T(0)) ? x*T(-1) : x ) : std::log(x);
00062 
00063   for(u32 i=1; i<N; ++i)
00064     {
00065     const eT x = A[i];
00066     
00067     sign *= (is_complex<eT>::value == false) ? ( (access::tmp_real(x) < T(0)) ? -1 : +1 ) : +1;
00068     val  += (is_complex<eT>::value == false) ? std::log( (access::tmp_real(x) < T(0)) ? x*T(-1) : x ) : std::log(x);
00069     }
00070   
00071   out_val  = val;
00072   out_sign = sign;
00073   }