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