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