//! 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) |
//!
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); }
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; }