fn_rank.hpp

Go to the documentation of this file.
00001 // Copyright (C) 2010 NICTA and the authors listed below
00002 // http://nicta.com.au
00003 // 
00004 // Authors:
00005 // - Conrad Sanderson (conradsand at ieee dot org)
00006 // - Dimitrios Bouzas (dimitris dot mpouzas at gmail dot com)
00007 // 
00008 // This file is part of the Armadillo C++ library.
00009 // It is provided without any warranty of fitness
00010 // for any purpose. You can redistribute this file
00011 // and/or modify it under the terms of the GNU
00012 // Lesser General Public License (LGPL) as published
00013 // by the Free Software Foundation, either version 3
00014 // of the License or (at your option) any later version.
00015 // (see http://www.opensource.org/licenses for more info)
00016 
00017 
00018 //! \addtogroup fn_rank
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     // count non zero valued elements in s
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 //! @}