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