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