Chris@49
|
1 // Copyright (C) 2012-2013 NICTA (www.nicta.com.au)
|
Chris@49
|
2 // Copyright (C) 2012-2013 Conrad Sanderson
|
Chris@49
|
3 // Copyright (C) 2012 Boris Sabanin
|
Chris@49
|
4 //
|
Chris@49
|
5 // This Source Code Form is subject to the terms of the Mozilla Public
|
Chris@49
|
6 // License, v. 2.0. If a copy of the MPL was not distributed with this
|
Chris@49
|
7 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
Chris@49
|
8
|
Chris@49
|
9
|
Chris@49
|
10
|
Chris@49
|
11 template<typename T1, typename T2>
|
Chris@49
|
12 inline
|
Chris@49
|
13 void
|
Chris@49
|
14 glue_histc::apply(Mat<uword>& out, const mtGlue<uword,T1,T2,glue_histc>& in)
|
Chris@49
|
15 {
|
Chris@49
|
16 arma_extra_debug_sigprint();
|
Chris@49
|
17
|
Chris@49
|
18 typedef typename T1::elem_type eT;
|
Chris@49
|
19
|
Chris@49
|
20 const uword dim = in.aux_uword;
|
Chris@49
|
21
|
Chris@49
|
22 const unwrap_check_mixed<T1> tmp1(in.A, out);
|
Chris@49
|
23 const unwrap_check_mixed<T2> tmp2(in.B, out);
|
Chris@49
|
24
|
Chris@49
|
25 const Mat<eT>& X = tmp1.M;
|
Chris@49
|
26 const Mat<eT>& E = tmp2.M;
|
Chris@49
|
27
|
Chris@49
|
28 arma_debug_check
|
Chris@49
|
29 (
|
Chris@49
|
30 ((E.is_vec() == false) && (E.is_empty() == false)),
|
Chris@49
|
31 "histc(): parameter 'edges' must be a vector"
|
Chris@49
|
32 );
|
Chris@49
|
33
|
Chris@49
|
34 arma_debug_check
|
Chris@49
|
35 (
|
Chris@49
|
36 (dim > 1),
|
Chris@49
|
37 "histc(): parameter 'dim' must be 0 or 1"
|
Chris@49
|
38 );
|
Chris@49
|
39
|
Chris@49
|
40 const uword X_n_elem = X.n_elem;
|
Chris@49
|
41 const uword X_n_rows = X.n_rows;
|
Chris@49
|
42 const uword X_n_cols = X.n_cols;
|
Chris@49
|
43
|
Chris@49
|
44 const uword E_n_elem = E.n_elem;
|
Chris@49
|
45
|
Chris@49
|
46 if( E_n_elem == 0 )
|
Chris@49
|
47 {
|
Chris@49
|
48 out.reset();
|
Chris@49
|
49 return;
|
Chris@49
|
50 }
|
Chris@49
|
51
|
Chris@49
|
52
|
Chris@49
|
53 // for vectors we are currently ignoring the "dim" parameter
|
Chris@49
|
54
|
Chris@49
|
55 uword out_n_rows = 0;
|
Chris@49
|
56 uword out_n_cols = 0;
|
Chris@49
|
57
|
Chris@49
|
58 if(X.is_vec())
|
Chris@49
|
59 {
|
Chris@49
|
60 if(X.is_rowvec())
|
Chris@49
|
61 {
|
Chris@49
|
62 out_n_rows = 1;
|
Chris@49
|
63 out_n_cols = E_n_elem;
|
Chris@49
|
64 }
|
Chris@49
|
65 else
|
Chris@49
|
66 if(X.is_colvec())
|
Chris@49
|
67 {
|
Chris@49
|
68 out_n_rows = E_n_elem;
|
Chris@49
|
69 out_n_cols = 1;
|
Chris@49
|
70 }
|
Chris@49
|
71 }
|
Chris@49
|
72 else
|
Chris@49
|
73 {
|
Chris@49
|
74 if(dim == 0)
|
Chris@49
|
75 {
|
Chris@49
|
76 out_n_rows = E_n_elem;
|
Chris@49
|
77 out_n_cols = X_n_cols;
|
Chris@49
|
78 }
|
Chris@49
|
79 else
|
Chris@49
|
80 if(dim == 1)
|
Chris@49
|
81 {
|
Chris@49
|
82 out_n_rows = X_n_rows;
|
Chris@49
|
83 out_n_cols = E_n_elem;
|
Chris@49
|
84 }
|
Chris@49
|
85 }
|
Chris@49
|
86
|
Chris@49
|
87 out.zeros(out_n_rows, out_n_cols);
|
Chris@49
|
88
|
Chris@49
|
89 const eT* E_mem = E.memptr();
|
Chris@49
|
90
|
Chris@49
|
91 if(X.is_vec() == true)
|
Chris@49
|
92 {
|
Chris@49
|
93 uword* out_mem = out.memptr();
|
Chris@49
|
94 const eT* X_mem = X.memptr();
|
Chris@49
|
95
|
Chris@49
|
96 for(uword j=0; j<X_n_elem; ++j)
|
Chris@49
|
97 {
|
Chris@49
|
98 const eT val = X_mem[j];
|
Chris@49
|
99
|
Chris@49
|
100 for(uword i=0; i<E_n_elem-1; ++i)
|
Chris@49
|
101 {
|
Chris@49
|
102 if( (E_mem[i] <= val) && (val < E_mem[i+1]) )
|
Chris@49
|
103 {
|
Chris@49
|
104 out_mem[i]++;
|
Chris@49
|
105 break;
|
Chris@49
|
106 }
|
Chris@49
|
107 else
|
Chris@49
|
108 if(val == E_mem[E_n_elem-1])
|
Chris@49
|
109 {
|
Chris@49
|
110 // in general, the above == operation doesn't make sense for floating point values (due to precision issues),
|
Chris@49
|
111 // but is included for compatibility with Matlab and Octave.
|
Chris@49
|
112 // Matlab folks must have been smoking something strong.
|
Chris@49
|
113 out_mem[E_n_elem-1]++;
|
Chris@49
|
114 break;
|
Chris@49
|
115 }
|
Chris@49
|
116 }
|
Chris@49
|
117 }
|
Chris@49
|
118 }
|
Chris@49
|
119 else
|
Chris@49
|
120 if(dim == 0)
|
Chris@49
|
121 {
|
Chris@49
|
122 for(uword col=0; col<X_n_cols; ++col)
|
Chris@49
|
123 {
|
Chris@49
|
124 uword* out_coldata = out.colptr(col);
|
Chris@49
|
125 const eT* X_coldata = X.colptr(col);
|
Chris@49
|
126
|
Chris@49
|
127 for(uword row=0; row<X_n_rows; ++row)
|
Chris@49
|
128 {
|
Chris@49
|
129 const eT val = X_coldata[row];
|
Chris@49
|
130
|
Chris@49
|
131 for(uword i=0; i<E_n_elem-1; ++i)
|
Chris@49
|
132 {
|
Chris@49
|
133 if( (E_mem[i] <= val) && (val < E_mem[i+1]) )
|
Chris@49
|
134 {
|
Chris@49
|
135 out_coldata[i]++;
|
Chris@49
|
136 break;
|
Chris@49
|
137 }
|
Chris@49
|
138 else
|
Chris@49
|
139 if(val == E_mem[E_n_elem-1])
|
Chris@49
|
140 {
|
Chris@49
|
141 out_coldata[E_n_elem-1]++;
|
Chris@49
|
142 break;
|
Chris@49
|
143 }
|
Chris@49
|
144 }
|
Chris@49
|
145 }
|
Chris@49
|
146 }
|
Chris@49
|
147 }
|
Chris@49
|
148 else
|
Chris@49
|
149 if(dim == 1)
|
Chris@49
|
150 {
|
Chris@49
|
151 for(uword row=0; row<X_n_rows; ++row)
|
Chris@49
|
152 {
|
Chris@49
|
153 for(uword col=0; col<X_n_cols; ++col)
|
Chris@49
|
154 {
|
Chris@49
|
155 const eT val = X.at(row,col);
|
Chris@49
|
156
|
Chris@49
|
157 for(uword i=0; i<E_n_elem-1; ++i)
|
Chris@49
|
158 {
|
Chris@49
|
159 if( (E_mem[i] <= val) && (val < E_mem[i+1]) )
|
Chris@49
|
160 {
|
Chris@49
|
161 out.at(row,i)++;
|
Chris@49
|
162 break;
|
Chris@49
|
163 }
|
Chris@49
|
164 else
|
Chris@49
|
165 if(val == E_mem[E_n_elem-1])
|
Chris@49
|
166 {
|
Chris@49
|
167 out.at(row,E_n_elem-1)++;
|
Chris@49
|
168 break;
|
Chris@49
|
169 }
|
Chris@49
|
170 }
|
Chris@49
|
171 }
|
Chris@49
|
172 }
|
Chris@49
|
173 }
|
Chris@49
|
174 }
|