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(const Base<typename T1::elem_type,T1>& X, typename T1::pod_type tol = 0.0)
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
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 }
00070
00071
00072
00073