annotate armadillo-2.4.4/include/armadillo_bits/fn_rank.hpp @ 0:8b6102e2a9b0

Armadillo Library
author maxzanoni76 <max.zanoni@eecs.qmul.ac.uk>
date Wed, 11 Apr 2012 09:27:06 +0100
parents
children
rev   line source
max@0 1 // Copyright (C) 2009-2011 NICTA (www.nicta.com.au)
max@0 2 // Copyright (C) 2009-2011 Conrad Sanderson
max@0 3 // Copyright (C) 2009-2010 Dimitrios Bouzas
max@0 4 // Copyright (C) 2011 Stanislav Funiak
max@0 5 //
max@0 6 // This file is part of the Armadillo C++ library.
max@0 7 // It is provided without any warranty of fitness
max@0 8 // for any purpose. You can redistribute this file
max@0 9 // and/or modify it under the terms of the GNU
max@0 10 // Lesser General Public License (LGPL) as published
max@0 11 // by the Free Software Foundation, either version 3
max@0 12 // of the License or (at your option) any later version.
max@0 13 // (see http://www.opensource.org/licenses for more info)
max@0 14
max@0 15
max@0 16 //! \addtogroup fn_rank
max@0 17 //! @{
max@0 18
max@0 19
max@0 20
max@0 21 template<typename T1>
max@0 22 inline
max@0 23 arma_warn_unused
max@0 24 uword
max@0 25 rank
max@0 26 (
max@0 27 const Base<typename T1::elem_type,T1>& X,
max@0 28 typename T1::pod_type tol = 0.0,
max@0 29 const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0
max@0 30 )
max@0 31 {
max@0 32 arma_extra_debug_sigprint();
max@0 33 arma_ignore(junk);
max@0 34
max@0 35 typedef typename T1::elem_type eT;
max@0 36 typedef typename T1::pod_type T;
max@0 37
max@0 38 uword X_n_rows;
max@0 39 uword X_n_cols;
max@0 40 Col<T> s;
max@0 41
max@0 42 const bool status = auxlib::svd(s, X, X_n_rows, X_n_cols);
max@0 43 const uword n_elem = s.n_elem;
max@0 44
max@0 45 if(status == true)
max@0 46 {
max@0 47 if( (tol == T(0)) && (n_elem > 0) )
max@0 48 {
max@0 49 tol = (std::max)(X_n_rows, X_n_cols) * eop_aux::direct_eps(max(s));
max@0 50 }
max@0 51
max@0 52 // count non zero valued elements in s
max@0 53
max@0 54 const T* s_mem = s.memptr();
max@0 55 uword count = 0;
max@0 56
max@0 57 for(uword i=0; i<n_elem; ++i)
max@0 58 {
max@0 59 if(s_mem[i] > tol)
max@0 60 {
max@0 61 ++count;
max@0 62 }
max@0 63 }
max@0 64
max@0 65 return count;
max@0 66 }
max@0 67 else
max@0 68 {
max@0 69 arma_bad("rank(): failed to converge");
max@0 70
max@0 71 return uword(0);
max@0 72 }
max@0 73 }
max@0 74
max@0 75
max@0 76
max@0 77 //! @}