fn_rank.hpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 template<typename T1>
00024 inline
00025 arma_warn_unused
00026 u32
00027 rank
00028 (
00029 const Base<typename T1::elem_type,T1>& X,
00030 typename T1::pod_type tol = 0.0,
00031 const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0
00032 )
00033 {
00034 arma_extra_debug_sigprint();
00035
00036 typedef typename T1::elem_type eT;
00037 typedef typename T1::pod_type T;
00038
00039 const unwrap<T1> tmp(X.get_ref());
00040 const Mat<eT>& A = tmp.M;
00041
00042 Col<T> s;
00043 const bool status = auxlib::svd(s, A);
00044
00045 if(status == true)
00046 {
00047 if(tol == T(0))
00048 {
00049 tol = (std::max)(A.n_rows, A.n_cols) * eop_aux::direct_eps(max(s));
00050 }
00051
00052
00053
00054 const T* s_mem = s.memptr();
00055 const u32 n_elem = s.n_elem;
00056 u32 count = 0;
00057
00058 for(u32 i=0; i<n_elem; ++i)
00059 {
00060 if(s_mem[i] > tol)
00061 {
00062 ++count;
00063 }
00064 }
00065
00066 return count;
00067 }
00068 else
00069 {
00070 arma_print("rank(): singular value decomposition failed");
00071 return u32(0);
00072 }
00073
00074 }
00075
00076
00077
00078