Chris@49
|
1 // Copyright (C) 2009-2012 NICTA (www.nicta.com.au)
|
Chris@49
|
2 // Copyright (C) 2009-2012 Conrad Sanderson
|
Chris@49
|
3 //
|
Chris@49
|
4 // This Source Code Form is subject to the terms of the Mozilla Public
|
Chris@49
|
5 // License, v. 2.0. If a copy of the MPL was not distributed with this
|
Chris@49
|
6 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
Chris@49
|
7
|
Chris@49
|
8
|
Chris@49
|
9 //! \addtogroup glue_relational
|
Chris@49
|
10 //! @{
|
Chris@49
|
11
|
Chris@49
|
12
|
Chris@49
|
13
|
Chris@49
|
14 #undef operator_rel
|
Chris@49
|
15 #undef operator_str
|
Chris@49
|
16
|
Chris@49
|
17 #undef arma_applier_mat
|
Chris@49
|
18 #undef arma_applier_cube
|
Chris@49
|
19
|
Chris@49
|
20
|
Chris@49
|
21 #define arma_applier_mat(operator_rel, operator_str) \
|
Chris@49
|
22 {\
|
Chris@49
|
23 const Proxy<T1> P1(X.A);\
|
Chris@49
|
24 const Proxy<T2> P2(X.B);\
|
Chris@49
|
25 \
|
Chris@49
|
26 arma_debug_assert_same_size(P1, P2, operator_str);\
|
Chris@49
|
27 \
|
Chris@49
|
28 const bool bad_alias = (Proxy<T1>::has_subview && P1.is_alias(out)) || (Proxy<T2>::has_subview && P2.is_alias(out));\
|
Chris@49
|
29 \
|
Chris@49
|
30 if(bad_alias == false)\
|
Chris@49
|
31 {\
|
Chris@49
|
32 \
|
Chris@49
|
33 const uword n_rows = P1.get_n_rows();\
|
Chris@49
|
34 const uword n_cols = P1.get_n_cols();\
|
Chris@49
|
35 \
|
Chris@49
|
36 out.set_size(n_rows, n_cols);\
|
Chris@49
|
37 \
|
Chris@49
|
38 uword* out_mem = out.memptr();\
|
Chris@49
|
39 \
|
Chris@49
|
40 const bool prefer_at_accessor = (Proxy<T1>::prefer_at_accessor || Proxy<T2>::prefer_at_accessor);\
|
Chris@49
|
41 \
|
Chris@49
|
42 if(prefer_at_accessor == false)\
|
Chris@49
|
43 {\
|
Chris@49
|
44 typename Proxy<T1>::ea_type A = P1.get_ea();\
|
Chris@49
|
45 typename Proxy<T2>::ea_type B = P2.get_ea();\
|
Chris@49
|
46 \
|
Chris@49
|
47 const uword n_elem = out.n_elem;\
|
Chris@49
|
48 \
|
Chris@49
|
49 for(uword i=0; i<n_elem; ++i)\
|
Chris@49
|
50 {\
|
Chris@49
|
51 out_mem[i] = (A[i] operator_rel B[i]) ? uword(1) : uword(0);\
|
Chris@49
|
52 }\
|
Chris@49
|
53 }\
|
Chris@49
|
54 else\
|
Chris@49
|
55 {\
|
Chris@49
|
56 if(n_rows == 1)\
|
Chris@49
|
57 {\
|
Chris@49
|
58 for(uword count=0; count < n_cols; ++count)\
|
Chris@49
|
59 {\
|
Chris@49
|
60 out_mem[count] = (P1.at(0,count) operator_rel P2.at(0,count)) ? uword(1) : uword(0);\
|
Chris@49
|
61 }\
|
Chris@49
|
62 }\
|
Chris@49
|
63 else\
|
Chris@49
|
64 {\
|
Chris@49
|
65 for(uword col=0; col<n_cols; ++col)\
|
Chris@49
|
66 for(uword row=0; row<n_rows; ++row)\
|
Chris@49
|
67 {\
|
Chris@49
|
68 *out_mem = (P1.at(row,col) operator_rel P2.at(row,col)) ? uword(1) : uword(0);\
|
Chris@49
|
69 out_mem++;\
|
Chris@49
|
70 }\
|
Chris@49
|
71 }\
|
Chris@49
|
72 }\
|
Chris@49
|
73 }\
|
Chris@49
|
74 else\
|
Chris@49
|
75 {\
|
Chris@49
|
76 const unwrap_check<typename Proxy<T1>::stored_type> tmp1(P1.Q, P1.is_alias(out));\
|
Chris@49
|
77 const unwrap_check<typename Proxy<T2>::stored_type> tmp2(P2.Q, P2.is_alias(out));\
|
Chris@49
|
78 \
|
Chris@49
|
79 out = (tmp1.M) operator_rel (tmp2.M);\
|
Chris@49
|
80 }\
|
Chris@49
|
81 }
|
Chris@49
|
82
|
Chris@49
|
83
|
Chris@49
|
84
|
Chris@49
|
85
|
Chris@49
|
86 #define arma_applier_cube(operator_rel, operator_str) \
|
Chris@49
|
87 {\
|
Chris@49
|
88 const ProxyCube<T1> P1(X.A);\
|
Chris@49
|
89 const ProxyCube<T2> P2(X.B);\
|
Chris@49
|
90 \
|
Chris@49
|
91 arma_debug_assert_same_size(P1, P2, operator_str);\
|
Chris@49
|
92 \
|
Chris@49
|
93 const bool bad_alias = (ProxyCube<T1>::has_subview && P1.is_alias(out)) || (ProxyCube<T2>::has_subview && P2.is_alias(out));\
|
Chris@49
|
94 \
|
Chris@49
|
95 if(bad_alias == false)\
|
Chris@49
|
96 {\
|
Chris@49
|
97 \
|
Chris@49
|
98 const uword n_rows = P1.get_n_rows();\
|
Chris@49
|
99 const uword n_cols = P1.get_n_cols();\
|
Chris@49
|
100 const uword n_slices = P1.get_n_slices();\
|
Chris@49
|
101 \
|
Chris@49
|
102 out.set_size(n_rows, n_cols, n_slices);\
|
Chris@49
|
103 \
|
Chris@49
|
104 uword* out_mem = out.memptr();\
|
Chris@49
|
105 \
|
Chris@49
|
106 const bool prefer_at_accessor = (ProxyCube<T1>::prefer_at_accessor || ProxyCube<T2>::prefer_at_accessor);\
|
Chris@49
|
107 \
|
Chris@49
|
108 if(prefer_at_accessor == false)\
|
Chris@49
|
109 {\
|
Chris@49
|
110 typename ProxyCube<T1>::ea_type A = P1.get_ea();\
|
Chris@49
|
111 typename ProxyCube<T2>::ea_type B = P2.get_ea();\
|
Chris@49
|
112 \
|
Chris@49
|
113 const uword n_elem = out.n_elem;\
|
Chris@49
|
114 \
|
Chris@49
|
115 for(uword i=0; i<n_elem; ++i)\
|
Chris@49
|
116 {\
|
Chris@49
|
117 out_mem[i] = (A[i] operator_rel B[i]) ? uword(1) : uword(0);\
|
Chris@49
|
118 }\
|
Chris@49
|
119 }\
|
Chris@49
|
120 else\
|
Chris@49
|
121 {\
|
Chris@49
|
122 for(uword slice = 0; slice < n_slices; ++slice)\
|
Chris@49
|
123 for(uword col = 0; col < n_cols; ++col )\
|
Chris@49
|
124 for(uword row = 0; row < n_rows; ++row )\
|
Chris@49
|
125 {\
|
Chris@49
|
126 *out_mem = (P1.at(row,col,slice) operator_rel P2.at(row,col,slice)) ? uword(1) : uword(0);\
|
Chris@49
|
127 out_mem++;\
|
Chris@49
|
128 }\
|
Chris@49
|
129 }\
|
Chris@49
|
130 }\
|
Chris@49
|
131 else\
|
Chris@49
|
132 {\
|
Chris@49
|
133 const unwrap_cube<typename ProxyCube<T1>::stored_type> tmp1(P1.Q);\
|
Chris@49
|
134 const unwrap_cube<typename ProxyCube<T2>::stored_type> tmp2(P2.Q);\
|
Chris@49
|
135 \
|
Chris@49
|
136 out = (tmp1.M) operator_rel (tmp2.M);\
|
Chris@49
|
137 }\
|
Chris@49
|
138 }
|
Chris@49
|
139
|
Chris@49
|
140
|
Chris@49
|
141
|
Chris@49
|
142 template<typename T1, typename T2>
|
Chris@49
|
143 inline
|
Chris@49
|
144 void
|
Chris@49
|
145 glue_rel_lt::apply
|
Chris@49
|
146 (
|
Chris@49
|
147 Mat <uword>& out,
|
Chris@49
|
148 const mtGlue<uword, T1, T2, glue_rel_lt>& X
|
Chris@49
|
149 )
|
Chris@49
|
150 {
|
Chris@49
|
151 arma_extra_debug_sigprint();
|
Chris@49
|
152
|
Chris@49
|
153 arma_applier_mat(<, "operator<");
|
Chris@49
|
154 }
|
Chris@49
|
155
|
Chris@49
|
156
|
Chris@49
|
157
|
Chris@49
|
158 template<typename T1, typename T2>
|
Chris@49
|
159 inline
|
Chris@49
|
160 void
|
Chris@49
|
161 glue_rel_gt::apply
|
Chris@49
|
162 (
|
Chris@49
|
163 Mat <uword>& out,
|
Chris@49
|
164 const mtGlue<uword, T1, T2, glue_rel_gt>& X
|
Chris@49
|
165 )
|
Chris@49
|
166 {
|
Chris@49
|
167 arma_extra_debug_sigprint();
|
Chris@49
|
168
|
Chris@49
|
169 arma_applier_mat(>, "operator>");
|
Chris@49
|
170 }
|
Chris@49
|
171
|
Chris@49
|
172
|
Chris@49
|
173
|
Chris@49
|
174 template<typename T1, typename T2>
|
Chris@49
|
175 inline
|
Chris@49
|
176 void
|
Chris@49
|
177 glue_rel_lteq::apply
|
Chris@49
|
178 (
|
Chris@49
|
179 Mat <uword>& out,
|
Chris@49
|
180 const mtGlue<uword, T1, T2, glue_rel_lteq>& X
|
Chris@49
|
181 )
|
Chris@49
|
182 {
|
Chris@49
|
183 arma_extra_debug_sigprint();
|
Chris@49
|
184
|
Chris@49
|
185 arma_applier_mat(<=, "operator<=");
|
Chris@49
|
186 }
|
Chris@49
|
187
|
Chris@49
|
188
|
Chris@49
|
189
|
Chris@49
|
190 template<typename T1, typename T2>
|
Chris@49
|
191 inline
|
Chris@49
|
192 void
|
Chris@49
|
193 glue_rel_gteq::apply
|
Chris@49
|
194 (
|
Chris@49
|
195 Mat <uword>& out,
|
Chris@49
|
196 const mtGlue<uword, T1, T2, glue_rel_gteq>& X
|
Chris@49
|
197 )
|
Chris@49
|
198 {
|
Chris@49
|
199 arma_extra_debug_sigprint();
|
Chris@49
|
200
|
Chris@49
|
201 arma_applier_mat(>=, "operator>=");
|
Chris@49
|
202 }
|
Chris@49
|
203
|
Chris@49
|
204
|
Chris@49
|
205
|
Chris@49
|
206 template<typename T1, typename T2>
|
Chris@49
|
207 inline
|
Chris@49
|
208 void
|
Chris@49
|
209 glue_rel_eq::apply
|
Chris@49
|
210 (
|
Chris@49
|
211 Mat <uword>& out,
|
Chris@49
|
212 const mtGlue<uword, T1, T2, glue_rel_eq>& X
|
Chris@49
|
213 )
|
Chris@49
|
214 {
|
Chris@49
|
215 arma_extra_debug_sigprint();
|
Chris@49
|
216
|
Chris@49
|
217 arma_applier_mat(==, "operator==");
|
Chris@49
|
218 }
|
Chris@49
|
219
|
Chris@49
|
220
|
Chris@49
|
221
|
Chris@49
|
222 template<typename T1, typename T2>
|
Chris@49
|
223 inline
|
Chris@49
|
224 void
|
Chris@49
|
225 glue_rel_noteq::apply
|
Chris@49
|
226 (
|
Chris@49
|
227 Mat <uword>& out,
|
Chris@49
|
228 const mtGlue<uword, T1, T2, glue_rel_noteq>& X
|
Chris@49
|
229 )
|
Chris@49
|
230 {
|
Chris@49
|
231 arma_extra_debug_sigprint();
|
Chris@49
|
232
|
Chris@49
|
233 arma_applier_mat(!=, "operator!=");
|
Chris@49
|
234 }
|
Chris@49
|
235
|
Chris@49
|
236
|
Chris@49
|
237
|
Chris@49
|
238 //
|
Chris@49
|
239 //
|
Chris@49
|
240 //
|
Chris@49
|
241
|
Chris@49
|
242
|
Chris@49
|
243
|
Chris@49
|
244 template<typename T1, typename T2>
|
Chris@49
|
245 inline
|
Chris@49
|
246 void
|
Chris@49
|
247 glue_rel_lt::apply
|
Chris@49
|
248 (
|
Chris@49
|
249 Cube <uword>& out,
|
Chris@49
|
250 const mtGlueCube<uword, T1, T2, glue_rel_lt>& X
|
Chris@49
|
251 )
|
Chris@49
|
252 {
|
Chris@49
|
253 arma_extra_debug_sigprint();
|
Chris@49
|
254
|
Chris@49
|
255 arma_applier_cube(<, "operator<");
|
Chris@49
|
256 }
|
Chris@49
|
257
|
Chris@49
|
258
|
Chris@49
|
259
|
Chris@49
|
260 template<typename T1, typename T2>
|
Chris@49
|
261 inline
|
Chris@49
|
262 void
|
Chris@49
|
263 glue_rel_gt::apply
|
Chris@49
|
264 (
|
Chris@49
|
265 Cube <uword>& out,
|
Chris@49
|
266 const mtGlueCube<uword, T1, T2, glue_rel_gt>& X
|
Chris@49
|
267 )
|
Chris@49
|
268 {
|
Chris@49
|
269 arma_extra_debug_sigprint();
|
Chris@49
|
270
|
Chris@49
|
271 arma_applier_cube(>, "operator>");
|
Chris@49
|
272 }
|
Chris@49
|
273
|
Chris@49
|
274
|
Chris@49
|
275
|
Chris@49
|
276 template<typename T1, typename T2>
|
Chris@49
|
277 inline
|
Chris@49
|
278 void
|
Chris@49
|
279 glue_rel_lteq::apply
|
Chris@49
|
280 (
|
Chris@49
|
281 Cube <uword>& out,
|
Chris@49
|
282 const mtGlueCube<uword, T1, T2, glue_rel_lteq>& X
|
Chris@49
|
283 )
|
Chris@49
|
284 {
|
Chris@49
|
285 arma_extra_debug_sigprint();
|
Chris@49
|
286
|
Chris@49
|
287 arma_applier_cube(<=, "operator<=");
|
Chris@49
|
288 }
|
Chris@49
|
289
|
Chris@49
|
290
|
Chris@49
|
291
|
Chris@49
|
292 template<typename T1, typename T2>
|
Chris@49
|
293 inline
|
Chris@49
|
294 void
|
Chris@49
|
295 glue_rel_gteq::apply
|
Chris@49
|
296 (
|
Chris@49
|
297 Cube <uword>& out,
|
Chris@49
|
298 const mtGlueCube<uword, T1, T2, glue_rel_gteq>& X
|
Chris@49
|
299 )
|
Chris@49
|
300 {
|
Chris@49
|
301 arma_extra_debug_sigprint();
|
Chris@49
|
302
|
Chris@49
|
303 arma_applier_cube(>=, "operator>=");
|
Chris@49
|
304 }
|
Chris@49
|
305
|
Chris@49
|
306
|
Chris@49
|
307
|
Chris@49
|
308 template<typename T1, typename T2>
|
Chris@49
|
309 inline
|
Chris@49
|
310 void
|
Chris@49
|
311 glue_rel_eq::apply
|
Chris@49
|
312 (
|
Chris@49
|
313 Cube <uword>& out,
|
Chris@49
|
314 const mtGlueCube<uword, T1, T2, glue_rel_eq>& X
|
Chris@49
|
315 )
|
Chris@49
|
316 {
|
Chris@49
|
317 arma_extra_debug_sigprint();
|
Chris@49
|
318
|
Chris@49
|
319 arma_applier_cube(==, "operator==");
|
Chris@49
|
320 }
|
Chris@49
|
321
|
Chris@49
|
322
|
Chris@49
|
323
|
Chris@49
|
324 template<typename T1, typename T2>
|
Chris@49
|
325 inline
|
Chris@49
|
326 void
|
Chris@49
|
327 glue_rel_noteq::apply
|
Chris@49
|
328 (
|
Chris@49
|
329 Cube <uword>& out,
|
Chris@49
|
330 const mtGlueCube<uword, T1, T2, glue_rel_noteq>& X
|
Chris@49
|
331 )
|
Chris@49
|
332 {
|
Chris@49
|
333 arma_extra_debug_sigprint();
|
Chris@49
|
334
|
Chris@49
|
335 arma_applier_cube(!=, "operator!=");
|
Chris@49
|
336 }
|
Chris@49
|
337
|
Chris@49
|
338
|
Chris@49
|
339
|
Chris@49
|
340 #undef arma_applier_mat
|
Chris@49
|
341 #undef arma_applier_cube
|
Chris@49
|
342
|
Chris@49
|
343
|
Chris@49
|
344
|
Chris@49
|
345 //! @}
|