//! More...
Functions | |
| template<typename T1 > | |
| arma_warn_unused u32 | rank (const Base< typename T1::elem_type, T1 > &X, typename T1::pod_type tol=0.0, const typename arma_blas_type_only< typename T1::elem_type >::result *junk=0) |
//!
| arma_warn_unused u32 rank | ( | const Base< typename T1::elem_type, T1 > & | X, | |
| typename T1::pod_type | tol = 0.0, |
|||
| const typename arma_blas_type_only< typename T1::elem_type >::result * | junk = 0 | |||
| ) | [inline] |
Definition at line 28 of file fn_rank.hpp.
References arma_print(), eop_aux::direct_eps(), Base< elem_type, derived >::get_ref(), max(), Mat< eT >::memptr(), Mat< eT >::n_elem, and auxlib::svd().
{
arma_extra_debug_sigprint();
typedef typename T1::elem_type eT;
typedef typename T1::pod_type T;
const unwrap<T1> tmp(X.get_ref());
const Mat<eT>& A = tmp.M;
Col<T> s;
const bool status = auxlib::svd(s, A);
if(status == true)
{
if(tol == T(0))
{
tol = (std::max)(A.n_rows, A.n_cols) * eop_aux::direct_eps(max(s));
}
// count non zero valued elements in s
const T* s_mem = s.memptr();
const u32 n_elem = s.n_elem;
u32 count = 0;
for(u32 i=0; i<n_elem; ++i)
{
if(s_mem[i] > tol)
{
++count;
}
}
return count;
}
else
{
arma_print("rank(): singular value decomposition failed");
return u32(0);
}
}