Functions | |
template<typename T1 > | |
arma_warn_unused u32 | rank (const Base< typename T1::elem_type, T1 > &X, typename T1::pod_type tol=0.0) |
arma_warn_unused u32 rank | ( | const Base< typename T1::elem_type, T1 > & | X, | |
typename T1::pod_type | tol = 0.0 | |||
) | [inline] |
Definition at line 27 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().
00028 { 00029 arma_extra_debug_sigprint(); 00030 00031 typedef typename T1::elem_type eT; 00032 typedef typename T1::pod_type T; 00033 00034 const unwrap<T1> tmp(X.get_ref()); 00035 const Mat<eT>& A = tmp.M; 00036 00037 Col<T> s; 00038 const bool status = auxlib::svd(s, A); 00039 00040 if(status == true) 00041 { 00042 if(tol == T(0)) 00043 { 00044 tol = (std::max)(A.n_rows, A.n_cols) * eop_aux::direct_eps(max(s)); 00045 } 00046 00047 // count non zero valued elements in s 00048 00049 const T* s_mem = s.memptr(); 00050 const u32 n_elem = s.n_elem; 00051 u32 count = 0; 00052 00053 for(u32 i=0; i<n_elem; ++i) 00054 { 00055 if(s_mem[i] > tol) 00056 { 00057 ++count; 00058 } 00059 } 00060 00061 return count; 00062 } 00063 else 00064 { 00065 arma_print("rank(): singular value decomposition failed"); 00066 return u32(0); 00067 } 00068 00069 }