Functions

Fn_log_det

//! More...

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)

Detailed Description

//!


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

  {
  arma_extra_debug_sigprint();
  
  typedef typename T1::elem_type eT;
  
  const unwrap<T1>   tmp(X.get_ref());
  const Mat<eT>& A = tmp.M;
  
  arma_debug_check( !A.is_square(), "log_det(): matrix must be square" );
  
  auxlib::log_det(out_val, out_sign, A);
  }

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

  {
  arma_extra_debug_sigprint();
  
  typedef typename T1::elem_type eT;
  typedef typename T1::pod_type   T;
  
  const diagmat_proxy<T1> A(X.m);
  
  const u32 N = A.n_elem;
  
  arma_debug_check( (N == 0), "log_det(): given matrix has no elements" );
  
  const eT x = A[0];
  
  T  sign = (is_complex<eT>::value == false) ? ( (access::tmp_real(x) < T(0)) ? -1 : +1 ) : +1;
  eT val  = (is_complex<eT>::value == false) ? std::log( (access::tmp_real(x) < T(0)) ? x*T(-1) : x ) : std::log(x);

  for(u32 i=1; i<N; ++i)
    {
    const eT x = A[i];
    
    sign *= (is_complex<eT>::value == false) ? ( (access::tmp_real(x) < T(0)) ? -1 : +1 ) : +1;
    val  += (is_complex<eT>::value == false) ? std::log( (access::tmp_real(x) < T(0)) ? x*T(-1) : x ) : std::log(x);
    }
  
  out_val  = val;
  out_sign = sign;
  }