Functions

Fn_rank

//! More...

Functions

template<typename T1 >
arma_warn_unused u32 rank (const Base< typename T1::elem_type, T1 > &X, typename T1::pod_type tol=0.0, const typename arma_blas_type_only< typename T1::elem_type >::result *junk=0)

Detailed Description

//!


Function Documentation

template<typename T1 >
arma_warn_unused u32 rank ( const Base< typename T1::elem_type, T1 > &  X,
typename T1::pod_type  tol = 0.0,
const typename arma_blas_type_only< typename T1::elem_type >::result *  junk = 0 
) [inline]

Definition at line 28 of file fn_rank.hpp.

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

  {
  arma_extra_debug_sigprint();
  
  typedef typename T1::elem_type eT;
  typedef typename T1::pod_type   T;
  
  const unwrap<T1>   tmp(X.get_ref());
  const Mat<eT>& A = tmp.M;
  
  Col<T> s;
  const bool status = auxlib::svd(s, A);
  
  if(status == true)
    {
    if(tol == T(0))
      {
      tol = (std::max)(A.n_rows, A.n_cols) * eop_aux::direct_eps(max(s));
      }
      
    // count non zero valued elements in s
    
    const T*  s_mem  = s.memptr();
    const u32 n_elem = s.n_elem;
          u32 count  = 0;
    
    for(u32 i=0; i<n_elem; ++i)
      {
      if(s_mem[i] > tol)
        {
        ++count;
        }
      }
    
    return count;
    }
  else
    {
    arma_print("rank(): singular value decomposition failed");
    return u32(0);
    }
   
  }