Fn_rank

Functions

template<typename T1 >
u32 rank (const Base< typename T1::elem_type, T1 > &X, typename T1::pod_type tol=0.0)

Function Documentation

template<typename T1 >
u32 rank ( const Base< typename T1::elem_type, T1 > &  X,
typename T1::pod_type  tol = 0.0 
) [inline]

Definition at line 26 of file fn_rank.hpp.

References arma_print(), op_eps::direct_eps(), Base< elem_type, derived >::get_ref(), max(), Mat< eT >::memptr(), Mat< eT >::n_elem, and auxlib::svd().

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     // count non zero valued elements in s
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   }