Chris@49
|
1 // Copyright (C) 2011-2013 NICTA (www.nicta.com.au)
|
Chris@49
|
2 // Copyright (C) 2011-2013 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 arrayops
|
Chris@49
|
10 //! @{
|
Chris@49
|
11
|
Chris@49
|
12
|
Chris@49
|
13
|
Chris@49
|
14 template<typename eT>
|
Chris@49
|
15 arma_hot
|
Chris@49
|
16 arma_inline
|
Chris@49
|
17 void
|
Chris@49
|
18 arrayops::copy(eT* dest, const eT* src, const uword n_elem)
|
Chris@49
|
19 {
|
Chris@49
|
20 switch(n_elem)
|
Chris@49
|
21 {
|
Chris@49
|
22 default:
|
Chris@49
|
23 arrayops::copy_big(dest, src, n_elem);
|
Chris@49
|
24 break;
|
Chris@49
|
25 case 8:
|
Chris@49
|
26 dest[7] = src[7];
|
Chris@49
|
27 case 7:
|
Chris@49
|
28 dest[6] = src[6];
|
Chris@49
|
29 case 6:
|
Chris@49
|
30 dest[5] = src[5];
|
Chris@49
|
31 case 5:
|
Chris@49
|
32 dest[4] = src[4];
|
Chris@49
|
33 case 4:
|
Chris@49
|
34 dest[3] = src[3];
|
Chris@49
|
35 case 3:
|
Chris@49
|
36 dest[2] = src[2];
|
Chris@49
|
37 case 2:
|
Chris@49
|
38 dest[1] = src[1];
|
Chris@49
|
39 case 1:
|
Chris@49
|
40 dest[0] = src[0];
|
Chris@49
|
41 }
|
Chris@49
|
42 }
|
Chris@49
|
43
|
Chris@49
|
44
|
Chris@49
|
45
|
Chris@49
|
46 template<typename eT>
|
Chris@49
|
47 inline
|
Chris@49
|
48 void
|
Chris@49
|
49 arrayops::copy_big(eT* dest, const eT* src, const uword n_elem)
|
Chris@49
|
50 {
|
Chris@49
|
51 switch(n_elem)
|
Chris@49
|
52 {
|
Chris@49
|
53 default:
|
Chris@49
|
54 std::memcpy(dest, src, n_elem*sizeof(eT));
|
Chris@49
|
55 break;
|
Chris@49
|
56 case 32:
|
Chris@49
|
57 dest[31] = src[31];
|
Chris@49
|
58 case 31:
|
Chris@49
|
59 dest[30] = src[30];
|
Chris@49
|
60 case 30:
|
Chris@49
|
61 dest[29] = src[29];
|
Chris@49
|
62 case 29:
|
Chris@49
|
63 dest[28] = src[28];
|
Chris@49
|
64 case 28:
|
Chris@49
|
65 dest[27] = src[27];
|
Chris@49
|
66 case 27:
|
Chris@49
|
67 dest[26] = src[26];
|
Chris@49
|
68 case 26:
|
Chris@49
|
69 dest[25] = src[25];
|
Chris@49
|
70 case 25:
|
Chris@49
|
71 dest[24] = src[24];
|
Chris@49
|
72 case 24:
|
Chris@49
|
73 dest[23] = src[23];
|
Chris@49
|
74 case 23:
|
Chris@49
|
75 dest[22] = src[22];
|
Chris@49
|
76 case 22:
|
Chris@49
|
77 dest[21] = src[21];
|
Chris@49
|
78 case 21:
|
Chris@49
|
79 dest[20] = src[20];
|
Chris@49
|
80 case 20:
|
Chris@49
|
81 dest[19] = src[19];
|
Chris@49
|
82 case 19:
|
Chris@49
|
83 dest[18] = src[18];
|
Chris@49
|
84 case 18:
|
Chris@49
|
85 dest[17] = src[17];
|
Chris@49
|
86 case 17:
|
Chris@49
|
87 dest[16] = src[16];
|
Chris@49
|
88 case 16:
|
Chris@49
|
89 dest[15] = src[15];
|
Chris@49
|
90 case 15:
|
Chris@49
|
91 dest[14] = src[14];
|
Chris@49
|
92 case 14:
|
Chris@49
|
93 dest[13] = src[13];
|
Chris@49
|
94 case 13:
|
Chris@49
|
95 dest[12] = src[12];
|
Chris@49
|
96 case 12:
|
Chris@49
|
97 dest[11] = src[11];
|
Chris@49
|
98 case 11:
|
Chris@49
|
99 dest[10] = src[10];
|
Chris@49
|
100 case 10:
|
Chris@49
|
101 dest[9] = src[9];
|
Chris@49
|
102 case 9:
|
Chris@49
|
103 dest[8] = src[8];
|
Chris@49
|
104 case 8:
|
Chris@49
|
105 dest[7] = src[7];
|
Chris@49
|
106 case 7:
|
Chris@49
|
107 dest[6] = src[6];
|
Chris@49
|
108 case 6:
|
Chris@49
|
109 dest[5] = src[5];
|
Chris@49
|
110 case 5:
|
Chris@49
|
111 dest[4] = src[4];
|
Chris@49
|
112 case 4:
|
Chris@49
|
113 dest[3] = src[3];
|
Chris@49
|
114 case 3:
|
Chris@49
|
115 dest[2] = src[2];
|
Chris@49
|
116 case 2:
|
Chris@49
|
117 dest[1] = src[1];
|
Chris@49
|
118 case 1:
|
Chris@49
|
119 dest[0] = src[0];
|
Chris@49
|
120 }
|
Chris@49
|
121 }
|
Chris@49
|
122
|
Chris@49
|
123
|
Chris@49
|
124
|
Chris@49
|
125 template<typename eT>
|
Chris@49
|
126 arma_hot
|
Chris@49
|
127 inline
|
Chris@49
|
128 void
|
Chris@49
|
129 arrayops::copy_forwards(eT* dest, const eT* src, const uword n_elem)
|
Chris@49
|
130 {
|
Chris@49
|
131 // can't use std::memcpy(), as we don't know how it copies data
|
Chris@49
|
132 uword i,j;
|
Chris@49
|
133
|
Chris@49
|
134 for(i=0, j=1; j < n_elem; i+=2, j+=2)
|
Chris@49
|
135 {
|
Chris@49
|
136 dest[i] = src[i];
|
Chris@49
|
137 dest[j] = src[j];
|
Chris@49
|
138 }
|
Chris@49
|
139
|
Chris@49
|
140 if(i < n_elem)
|
Chris@49
|
141 {
|
Chris@49
|
142 dest[i] = src[i];
|
Chris@49
|
143 }
|
Chris@49
|
144 }
|
Chris@49
|
145
|
Chris@49
|
146
|
Chris@49
|
147
|
Chris@49
|
148 // template<typename eT>
|
Chris@49
|
149 // arma_hot
|
Chris@49
|
150 // inline
|
Chris@49
|
151 // void
|
Chris@49
|
152 // arrayops::copy_backwards(eT* dest, const eT* src, const uword n_elem)
|
Chris@49
|
153 // {
|
Chris@49
|
154 // // can't use std::memcpy(), as we don't know how it copies data
|
Chris@49
|
155 //
|
Chris@49
|
156 // switch(n_elem)
|
Chris@49
|
157 // {
|
Chris@49
|
158 // default:
|
Chris@49
|
159 // for(uword i = (n_elem-1); i >= 1; --i) { dest[i] = src[i]; }
|
Chris@49
|
160 // // NOTE: the 'break' statement has been deliberately omitted
|
Chris@49
|
161 // case 1:
|
Chris@49
|
162 // dest[0] = src[0];
|
Chris@49
|
163 // case 0:
|
Chris@49
|
164 // ;
|
Chris@49
|
165 // }
|
Chris@49
|
166 // }
|
Chris@49
|
167
|
Chris@49
|
168
|
Chris@49
|
169
|
Chris@49
|
170 template<typename eT>
|
Chris@49
|
171 arma_hot
|
Chris@49
|
172 inline
|
Chris@49
|
173 void
|
Chris@49
|
174 arrayops::copy_backwards(eT* dest, const eT* src, const uword n_elem)
|
Chris@49
|
175 {
|
Chris@49
|
176 // can't use std::memcpy(), as we don't know how it copies data
|
Chris@49
|
177
|
Chris@49
|
178 switch(n_elem)
|
Chris@49
|
179 {
|
Chris@49
|
180 default:
|
Chris@49
|
181 {
|
Chris@49
|
182 uword i, j;
|
Chris@49
|
183 for(i = (n_elem-1), j = (n_elem-2); j >= 2; i-=2, j-=2)
|
Chris@49
|
184 {
|
Chris@49
|
185 const eT tmp_i = src[i];
|
Chris@49
|
186 const eT tmp_j = src[j];
|
Chris@49
|
187
|
Chris@49
|
188 dest[i] = tmp_i;
|
Chris@49
|
189 dest[j] = tmp_j;
|
Chris@49
|
190 }
|
Chris@49
|
191
|
Chris@49
|
192 // j is less than 2: it can be 1 or 0
|
Chris@49
|
193 // i is j+1, ie. less than 3: it can be 2 or 1
|
Chris@49
|
194
|
Chris@49
|
195 if(i == 2)
|
Chris@49
|
196 {
|
Chris@49
|
197 dest[2] = src[2];
|
Chris@49
|
198 }
|
Chris@49
|
199 }
|
Chris@49
|
200 // NOTE: the 'break' statement has been deliberately omitted
|
Chris@49
|
201 case 2:
|
Chris@49
|
202 dest[1] = src[1];
|
Chris@49
|
203 case 1:
|
Chris@49
|
204 dest[0] = src[0];
|
Chris@49
|
205 case 0:
|
Chris@49
|
206 ;
|
Chris@49
|
207 }
|
Chris@49
|
208 }
|
Chris@49
|
209
|
Chris@49
|
210
|
Chris@49
|
211
|
Chris@49
|
212 template<typename out_eT, typename in_eT>
|
Chris@49
|
213 arma_hot
|
Chris@49
|
214 arma_inline
|
Chris@49
|
215 void
|
Chris@49
|
216 arrayops::convert_cx_scalar
|
Chris@49
|
217 (
|
Chris@49
|
218 out_eT& out,
|
Chris@49
|
219 const in_eT& in,
|
Chris@49
|
220 const typename arma_not_cx<out_eT>::result* junk1,
|
Chris@49
|
221 const typename arma_not_cx< in_eT>::result* junk2
|
Chris@49
|
222 )
|
Chris@49
|
223 {
|
Chris@49
|
224 arma_ignore(junk1);
|
Chris@49
|
225 arma_ignore(junk2);
|
Chris@49
|
226
|
Chris@49
|
227 out = out_eT(in);
|
Chris@49
|
228 }
|
Chris@49
|
229
|
Chris@49
|
230
|
Chris@49
|
231
|
Chris@49
|
232 template<typename out_eT, typename in_T>
|
Chris@49
|
233 arma_hot
|
Chris@49
|
234 arma_inline
|
Chris@49
|
235 void
|
Chris@49
|
236 arrayops::convert_cx_scalar
|
Chris@49
|
237 (
|
Chris@49
|
238 out_eT& out,
|
Chris@49
|
239 const std::complex<in_T>& in,
|
Chris@49
|
240 const typename arma_not_cx<out_eT>::result* junk
|
Chris@49
|
241 )
|
Chris@49
|
242 {
|
Chris@49
|
243 arma_ignore(junk);
|
Chris@49
|
244
|
Chris@49
|
245 out = out_eT( in.real() );
|
Chris@49
|
246 }
|
Chris@49
|
247
|
Chris@49
|
248
|
Chris@49
|
249
|
Chris@49
|
250 template<typename out_T, typename in_T>
|
Chris@49
|
251 arma_hot
|
Chris@49
|
252 arma_inline
|
Chris@49
|
253 void
|
Chris@49
|
254 arrayops::convert_cx_scalar
|
Chris@49
|
255 (
|
Chris@49
|
256 std::complex<out_T>& out,
|
Chris@49
|
257 const std::complex< in_T>& in
|
Chris@49
|
258 )
|
Chris@49
|
259 {
|
Chris@49
|
260 typedef std::complex<out_T> out_eT;
|
Chris@49
|
261
|
Chris@49
|
262 out = out_eT(in);
|
Chris@49
|
263 }
|
Chris@49
|
264
|
Chris@49
|
265
|
Chris@49
|
266
|
Chris@49
|
267 template<typename out_eT, typename in_eT>
|
Chris@49
|
268 arma_hot
|
Chris@49
|
269 inline
|
Chris@49
|
270 void
|
Chris@49
|
271 arrayops::convert(out_eT* dest, const in_eT* src, const uword n_elem)
|
Chris@49
|
272 {
|
Chris@49
|
273 uword i,j;
|
Chris@49
|
274
|
Chris@49
|
275 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
276 {
|
Chris@49
|
277 const in_eT tmp_i = src[i];
|
Chris@49
|
278 const in_eT tmp_j = src[j];
|
Chris@49
|
279
|
Chris@49
|
280 // dest[i] = out_eT( tmp_i );
|
Chris@49
|
281 // dest[j] = out_eT( tmp_j );
|
Chris@49
|
282
|
Chris@49
|
283 dest[i] = (is_signed<out_eT>::value)
|
Chris@49
|
284 ? out_eT( tmp_i )
|
Chris@49
|
285 : ( cond_rel< is_signed<in_eT>::value >::lt(tmp_i, in_eT(0)) ? out_eT(0) : out_eT(tmp_i) );
|
Chris@49
|
286
|
Chris@49
|
287 dest[j] = (is_signed<out_eT>::value)
|
Chris@49
|
288 ? out_eT( tmp_j )
|
Chris@49
|
289 : ( cond_rel< is_signed<in_eT>::value >::lt(tmp_j, in_eT(0)) ? out_eT(0) : out_eT(tmp_j) );
|
Chris@49
|
290 }
|
Chris@49
|
291
|
Chris@49
|
292 if(i < n_elem)
|
Chris@49
|
293 {
|
Chris@49
|
294 const in_eT tmp_i = src[i];
|
Chris@49
|
295
|
Chris@49
|
296 // dest[i] = out_eT( tmp_i );
|
Chris@49
|
297
|
Chris@49
|
298 dest[i] = (is_signed<out_eT>::value)
|
Chris@49
|
299 ? out_eT( tmp_i )
|
Chris@49
|
300 : ( cond_rel< is_signed<in_eT>::value >::lt(tmp_i, in_eT(0)) ? out_eT(0) : out_eT(tmp_i) );
|
Chris@49
|
301 }
|
Chris@49
|
302 }
|
Chris@49
|
303
|
Chris@49
|
304
|
Chris@49
|
305
|
Chris@49
|
306 template<typename out_eT, typename in_eT>
|
Chris@49
|
307 arma_hot
|
Chris@49
|
308 inline
|
Chris@49
|
309 void
|
Chris@49
|
310 arrayops::convert_cx(out_eT* dest, const in_eT* src, const uword n_elem)
|
Chris@49
|
311 {
|
Chris@49
|
312 uword i,j;
|
Chris@49
|
313
|
Chris@49
|
314 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
315 {
|
Chris@49
|
316 arrayops::convert_cx_scalar( dest[i], src[i] );
|
Chris@49
|
317 arrayops::convert_cx_scalar( dest[j], src[j] );
|
Chris@49
|
318 }
|
Chris@49
|
319
|
Chris@49
|
320 if(i < n_elem)
|
Chris@49
|
321 {
|
Chris@49
|
322 arrayops::convert_cx_scalar( dest[i], src[i] );
|
Chris@49
|
323 }
|
Chris@49
|
324 }
|
Chris@49
|
325
|
Chris@49
|
326
|
Chris@49
|
327
|
Chris@49
|
328 template<typename eT>
|
Chris@49
|
329 arma_hot
|
Chris@49
|
330 inline
|
Chris@49
|
331 void
|
Chris@49
|
332 arrayops::inplace_plus(eT* dest, const eT* src, const uword n_elem)
|
Chris@49
|
333 {
|
Chris@49
|
334 if(memory::is_aligned(dest))
|
Chris@49
|
335 {
|
Chris@49
|
336 memory::mark_as_aligned(dest);
|
Chris@49
|
337
|
Chris@49
|
338 if(memory::is_aligned(src))
|
Chris@49
|
339 {
|
Chris@49
|
340 memory::mark_as_aligned(src);
|
Chris@49
|
341
|
Chris@49
|
342 arrayops::inplace_plus_base(dest, src, n_elem);
|
Chris@49
|
343 }
|
Chris@49
|
344 else
|
Chris@49
|
345 {
|
Chris@49
|
346 arrayops::inplace_plus_base(dest, src, n_elem);
|
Chris@49
|
347 }
|
Chris@49
|
348 }
|
Chris@49
|
349 else
|
Chris@49
|
350 {
|
Chris@49
|
351 if(memory::is_aligned(src))
|
Chris@49
|
352 {
|
Chris@49
|
353 memory::mark_as_aligned(src);
|
Chris@49
|
354
|
Chris@49
|
355 arrayops::inplace_plus_base(dest, src, n_elem);
|
Chris@49
|
356 }
|
Chris@49
|
357 else
|
Chris@49
|
358 {
|
Chris@49
|
359 arrayops::inplace_plus_base(dest, src, n_elem);
|
Chris@49
|
360 }
|
Chris@49
|
361 }
|
Chris@49
|
362 }
|
Chris@49
|
363
|
Chris@49
|
364
|
Chris@49
|
365
|
Chris@49
|
366 template<typename eT>
|
Chris@49
|
367 arma_hot
|
Chris@49
|
368 inline
|
Chris@49
|
369 void
|
Chris@49
|
370 arrayops::inplace_minus(eT* dest, const eT* src, const uword n_elem)
|
Chris@49
|
371 {
|
Chris@49
|
372 if(memory::is_aligned(dest))
|
Chris@49
|
373 {
|
Chris@49
|
374 memory::mark_as_aligned(dest);
|
Chris@49
|
375
|
Chris@49
|
376 if(memory::is_aligned(src))
|
Chris@49
|
377 {
|
Chris@49
|
378 memory::mark_as_aligned(src);
|
Chris@49
|
379
|
Chris@49
|
380 arrayops::inplace_minus_base(dest, src, n_elem);
|
Chris@49
|
381 }
|
Chris@49
|
382 else
|
Chris@49
|
383 {
|
Chris@49
|
384 arrayops::inplace_minus_base(dest, src, n_elem);
|
Chris@49
|
385 }
|
Chris@49
|
386 }
|
Chris@49
|
387 else
|
Chris@49
|
388 {
|
Chris@49
|
389 if(memory::is_aligned(src))
|
Chris@49
|
390 {
|
Chris@49
|
391 memory::mark_as_aligned(src);
|
Chris@49
|
392
|
Chris@49
|
393 arrayops::inplace_minus_base(dest, src, n_elem);
|
Chris@49
|
394 }
|
Chris@49
|
395 else
|
Chris@49
|
396 {
|
Chris@49
|
397 arrayops::inplace_minus_base(dest, src, n_elem);
|
Chris@49
|
398 }
|
Chris@49
|
399 }
|
Chris@49
|
400 }
|
Chris@49
|
401
|
Chris@49
|
402
|
Chris@49
|
403
|
Chris@49
|
404 template<typename eT>
|
Chris@49
|
405 arma_hot
|
Chris@49
|
406 inline
|
Chris@49
|
407 void
|
Chris@49
|
408 arrayops::inplace_mul(eT* dest, const eT* src, const uword n_elem)
|
Chris@49
|
409 {
|
Chris@49
|
410 if(memory::is_aligned(dest))
|
Chris@49
|
411 {
|
Chris@49
|
412 memory::mark_as_aligned(dest);
|
Chris@49
|
413
|
Chris@49
|
414 if(memory::is_aligned(src))
|
Chris@49
|
415 {
|
Chris@49
|
416 memory::mark_as_aligned(src);
|
Chris@49
|
417
|
Chris@49
|
418 arrayops::inplace_mul_base(dest, src, n_elem);
|
Chris@49
|
419 }
|
Chris@49
|
420 else
|
Chris@49
|
421 {
|
Chris@49
|
422 arrayops::inplace_mul_base(dest, src, n_elem);
|
Chris@49
|
423 }
|
Chris@49
|
424 }
|
Chris@49
|
425 else
|
Chris@49
|
426 {
|
Chris@49
|
427 if(memory::is_aligned(src))
|
Chris@49
|
428 {
|
Chris@49
|
429 memory::mark_as_aligned(src);
|
Chris@49
|
430
|
Chris@49
|
431 arrayops::inplace_mul_base(dest, src, n_elem);
|
Chris@49
|
432 }
|
Chris@49
|
433 else
|
Chris@49
|
434 {
|
Chris@49
|
435 arrayops::inplace_mul_base(dest, src, n_elem);
|
Chris@49
|
436 }
|
Chris@49
|
437 }
|
Chris@49
|
438 }
|
Chris@49
|
439
|
Chris@49
|
440
|
Chris@49
|
441
|
Chris@49
|
442 template<typename eT>
|
Chris@49
|
443 arma_hot
|
Chris@49
|
444 inline
|
Chris@49
|
445 void
|
Chris@49
|
446 arrayops::inplace_div(eT* dest, const eT* src, const uword n_elem)
|
Chris@49
|
447 {
|
Chris@49
|
448 if(memory::is_aligned(dest))
|
Chris@49
|
449 {
|
Chris@49
|
450 memory::mark_as_aligned(dest);
|
Chris@49
|
451
|
Chris@49
|
452 if(memory::is_aligned(src))
|
Chris@49
|
453 {
|
Chris@49
|
454 memory::mark_as_aligned(src);
|
Chris@49
|
455
|
Chris@49
|
456 arrayops::inplace_div_base(dest, src, n_elem);
|
Chris@49
|
457 }
|
Chris@49
|
458 else
|
Chris@49
|
459 {
|
Chris@49
|
460 arrayops::inplace_div_base(dest, src, n_elem);
|
Chris@49
|
461 }
|
Chris@49
|
462 }
|
Chris@49
|
463 else
|
Chris@49
|
464 {
|
Chris@49
|
465 if(memory::is_aligned(src))
|
Chris@49
|
466 {
|
Chris@49
|
467 memory::mark_as_aligned(src);
|
Chris@49
|
468
|
Chris@49
|
469 arrayops::inplace_div_base(dest, src, n_elem);
|
Chris@49
|
470 }
|
Chris@49
|
471 else
|
Chris@49
|
472 {
|
Chris@49
|
473 arrayops::inplace_div_base(dest, src, n_elem);
|
Chris@49
|
474 }
|
Chris@49
|
475 }
|
Chris@49
|
476 }
|
Chris@49
|
477
|
Chris@49
|
478
|
Chris@49
|
479
|
Chris@49
|
480 template<typename eT>
|
Chris@49
|
481 arma_hot
|
Chris@49
|
482 inline
|
Chris@49
|
483 void
|
Chris@49
|
484 arrayops::inplace_plus_base(eT* dest, const eT* src, const uword n_elem)
|
Chris@49
|
485 {
|
Chris@49
|
486 uword i,j;
|
Chris@49
|
487
|
Chris@49
|
488 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
489 {
|
Chris@49
|
490 const eT tmp_i = src[i];
|
Chris@49
|
491 const eT tmp_j = src[j];
|
Chris@49
|
492
|
Chris@49
|
493 dest[i] += tmp_i;
|
Chris@49
|
494 dest[j] += tmp_j;
|
Chris@49
|
495 }
|
Chris@49
|
496
|
Chris@49
|
497 if(i < n_elem)
|
Chris@49
|
498 {
|
Chris@49
|
499 dest[i] += src[i];
|
Chris@49
|
500 }
|
Chris@49
|
501 }
|
Chris@49
|
502
|
Chris@49
|
503
|
Chris@49
|
504
|
Chris@49
|
505 template<typename eT>
|
Chris@49
|
506 arma_hot
|
Chris@49
|
507 inline
|
Chris@49
|
508 void
|
Chris@49
|
509 arrayops::inplace_minus_base(eT* dest, const eT* src, const uword n_elem)
|
Chris@49
|
510 {
|
Chris@49
|
511 uword i,j;
|
Chris@49
|
512
|
Chris@49
|
513 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
514 {
|
Chris@49
|
515 const eT tmp_i = src[i];
|
Chris@49
|
516 const eT tmp_j = src[j];
|
Chris@49
|
517
|
Chris@49
|
518 dest[i] -= tmp_i;
|
Chris@49
|
519 dest[j] -= tmp_j;
|
Chris@49
|
520 }
|
Chris@49
|
521
|
Chris@49
|
522 if(i < n_elem)
|
Chris@49
|
523 {
|
Chris@49
|
524 dest[i] -= src[i];
|
Chris@49
|
525 }
|
Chris@49
|
526 }
|
Chris@49
|
527
|
Chris@49
|
528
|
Chris@49
|
529
|
Chris@49
|
530 template<typename eT>
|
Chris@49
|
531 arma_hot
|
Chris@49
|
532 inline
|
Chris@49
|
533 void
|
Chris@49
|
534 arrayops::inplace_mul_base(eT* dest, const eT* src, const uword n_elem)
|
Chris@49
|
535 {
|
Chris@49
|
536 uword i,j;
|
Chris@49
|
537
|
Chris@49
|
538 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
539 {
|
Chris@49
|
540 const eT tmp_i = src[i];
|
Chris@49
|
541 const eT tmp_j = src[j];
|
Chris@49
|
542
|
Chris@49
|
543 dest[i] *= tmp_i;
|
Chris@49
|
544 dest[j] *= tmp_j;
|
Chris@49
|
545 }
|
Chris@49
|
546
|
Chris@49
|
547 if(i < n_elem)
|
Chris@49
|
548 {
|
Chris@49
|
549 dest[i] *= src[i];
|
Chris@49
|
550 }
|
Chris@49
|
551 }
|
Chris@49
|
552
|
Chris@49
|
553
|
Chris@49
|
554
|
Chris@49
|
555 template<typename eT>
|
Chris@49
|
556 arma_hot
|
Chris@49
|
557 inline
|
Chris@49
|
558 void
|
Chris@49
|
559 arrayops::inplace_div_base(eT* dest, const eT* src, const uword n_elem)
|
Chris@49
|
560 {
|
Chris@49
|
561 uword i,j;
|
Chris@49
|
562
|
Chris@49
|
563 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
564 {
|
Chris@49
|
565 const eT tmp_i = src[i];
|
Chris@49
|
566 const eT tmp_j = src[j];
|
Chris@49
|
567
|
Chris@49
|
568 dest[i] /= tmp_i;
|
Chris@49
|
569 dest[j] /= tmp_j;
|
Chris@49
|
570 }
|
Chris@49
|
571
|
Chris@49
|
572 if(i < n_elem)
|
Chris@49
|
573 {
|
Chris@49
|
574 dest[i] /= src[i];
|
Chris@49
|
575 }
|
Chris@49
|
576 }
|
Chris@49
|
577
|
Chris@49
|
578
|
Chris@49
|
579
|
Chris@49
|
580 template<typename eT>
|
Chris@49
|
581 arma_hot
|
Chris@49
|
582 inline
|
Chris@49
|
583 void
|
Chris@49
|
584 arrayops::inplace_set(eT* dest, const eT val, const uword n_elem)
|
Chris@49
|
585 {
|
Chris@49
|
586 if(memory::is_aligned(dest))
|
Chris@49
|
587 {
|
Chris@49
|
588 memory::mark_as_aligned(dest);
|
Chris@49
|
589
|
Chris@49
|
590 uword i,j;
|
Chris@49
|
591
|
Chris@49
|
592 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
593 {
|
Chris@49
|
594 dest[i] = val;
|
Chris@49
|
595 dest[j] = val;
|
Chris@49
|
596 }
|
Chris@49
|
597
|
Chris@49
|
598 if(i < n_elem)
|
Chris@49
|
599 {
|
Chris@49
|
600 dest[i] = val;
|
Chris@49
|
601 }
|
Chris@49
|
602 }
|
Chris@49
|
603 else
|
Chris@49
|
604 {
|
Chris@49
|
605 uword i,j;
|
Chris@49
|
606
|
Chris@49
|
607 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
608 {
|
Chris@49
|
609 dest[i] = val;
|
Chris@49
|
610 dest[j] = val;
|
Chris@49
|
611 }
|
Chris@49
|
612
|
Chris@49
|
613 if(i < n_elem)
|
Chris@49
|
614 {
|
Chris@49
|
615 dest[i] = val;
|
Chris@49
|
616 }
|
Chris@49
|
617 }
|
Chris@49
|
618 }
|
Chris@49
|
619
|
Chris@49
|
620
|
Chris@49
|
621
|
Chris@49
|
622 template<typename eT, const uword n_elem>
|
Chris@49
|
623 arma_hot
|
Chris@49
|
624 inline
|
Chris@49
|
625 void
|
Chris@49
|
626 arrayops::inplace_set_fixed(eT* dest, const eT val)
|
Chris@49
|
627 {
|
Chris@49
|
628 for(uword i=0; i<n_elem; ++i)
|
Chris@49
|
629 {
|
Chris@49
|
630 dest[i] = val;
|
Chris@49
|
631 }
|
Chris@49
|
632 }
|
Chris@49
|
633
|
Chris@49
|
634
|
Chris@49
|
635
|
Chris@49
|
636 template<typename eT>
|
Chris@49
|
637 arma_hot
|
Chris@49
|
638 inline
|
Chris@49
|
639 void
|
Chris@49
|
640 arrayops::inplace_plus(eT* dest, const eT val, const uword n_elem)
|
Chris@49
|
641 {
|
Chris@49
|
642 if(memory::is_aligned(dest))
|
Chris@49
|
643 {
|
Chris@49
|
644 memory::mark_as_aligned(dest);
|
Chris@49
|
645
|
Chris@49
|
646 uword i,j;
|
Chris@49
|
647
|
Chris@49
|
648 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
649 {
|
Chris@49
|
650 dest[i] += val;
|
Chris@49
|
651 dest[j] += val;
|
Chris@49
|
652 }
|
Chris@49
|
653
|
Chris@49
|
654 if(i < n_elem)
|
Chris@49
|
655 {
|
Chris@49
|
656 dest[i] += val;
|
Chris@49
|
657 }
|
Chris@49
|
658 }
|
Chris@49
|
659 else
|
Chris@49
|
660 {
|
Chris@49
|
661 uword i,j;
|
Chris@49
|
662
|
Chris@49
|
663 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
664 {
|
Chris@49
|
665 dest[i] += val;
|
Chris@49
|
666 dest[j] += val;
|
Chris@49
|
667 }
|
Chris@49
|
668
|
Chris@49
|
669 if(i < n_elem)
|
Chris@49
|
670 {
|
Chris@49
|
671 dest[i] += val;
|
Chris@49
|
672 }
|
Chris@49
|
673 }
|
Chris@49
|
674 }
|
Chris@49
|
675
|
Chris@49
|
676
|
Chris@49
|
677
|
Chris@49
|
678 template<typename eT>
|
Chris@49
|
679 arma_hot
|
Chris@49
|
680 inline
|
Chris@49
|
681 void
|
Chris@49
|
682 arrayops::inplace_minus(eT* dest, const eT val, const uword n_elem)
|
Chris@49
|
683 {
|
Chris@49
|
684 if(memory::is_aligned(dest))
|
Chris@49
|
685 {
|
Chris@49
|
686 memory::mark_as_aligned(dest);
|
Chris@49
|
687
|
Chris@49
|
688 uword i,j;
|
Chris@49
|
689
|
Chris@49
|
690 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
691 {
|
Chris@49
|
692 dest[i] -= val;
|
Chris@49
|
693 dest[j] -= val;
|
Chris@49
|
694 }
|
Chris@49
|
695
|
Chris@49
|
696 if(i < n_elem)
|
Chris@49
|
697 {
|
Chris@49
|
698 dest[i] -= val;
|
Chris@49
|
699 }
|
Chris@49
|
700 }
|
Chris@49
|
701 else
|
Chris@49
|
702 {
|
Chris@49
|
703 uword i,j;
|
Chris@49
|
704
|
Chris@49
|
705 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
706 {
|
Chris@49
|
707 dest[i] -= val;
|
Chris@49
|
708 dest[j] -= val;
|
Chris@49
|
709 }
|
Chris@49
|
710
|
Chris@49
|
711 if(i < n_elem)
|
Chris@49
|
712 {
|
Chris@49
|
713 dest[i] -= val;
|
Chris@49
|
714 }
|
Chris@49
|
715 }
|
Chris@49
|
716 }
|
Chris@49
|
717
|
Chris@49
|
718
|
Chris@49
|
719
|
Chris@49
|
720 template<typename eT>
|
Chris@49
|
721 arma_hot
|
Chris@49
|
722 inline
|
Chris@49
|
723 void
|
Chris@49
|
724 arrayops::inplace_mul(eT* dest, const eT val, const uword n_elem)
|
Chris@49
|
725 {
|
Chris@49
|
726 if(memory::is_aligned(dest))
|
Chris@49
|
727 {
|
Chris@49
|
728 memory::mark_as_aligned(dest);
|
Chris@49
|
729
|
Chris@49
|
730 uword i,j;
|
Chris@49
|
731
|
Chris@49
|
732 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
733 {
|
Chris@49
|
734 dest[i] *= val;
|
Chris@49
|
735 dest[j] *= val;
|
Chris@49
|
736 }
|
Chris@49
|
737
|
Chris@49
|
738 if(i < n_elem)
|
Chris@49
|
739 {
|
Chris@49
|
740 dest[i] *= val;
|
Chris@49
|
741 }
|
Chris@49
|
742 }
|
Chris@49
|
743 else
|
Chris@49
|
744 {
|
Chris@49
|
745 uword i,j;
|
Chris@49
|
746
|
Chris@49
|
747 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
748 {
|
Chris@49
|
749 dest[i] *= val;
|
Chris@49
|
750 dest[j] *= val;
|
Chris@49
|
751 }
|
Chris@49
|
752
|
Chris@49
|
753 if(i < n_elem)
|
Chris@49
|
754 {
|
Chris@49
|
755 dest[i] *= val;
|
Chris@49
|
756 }
|
Chris@49
|
757 }
|
Chris@49
|
758 }
|
Chris@49
|
759
|
Chris@49
|
760
|
Chris@49
|
761
|
Chris@49
|
762 template<typename eT>
|
Chris@49
|
763 arma_hot
|
Chris@49
|
764 inline
|
Chris@49
|
765 void
|
Chris@49
|
766 arrayops::inplace_div(eT* dest, const eT val, const uword n_elem)
|
Chris@49
|
767 {
|
Chris@49
|
768 if(memory::is_aligned(dest))
|
Chris@49
|
769 {
|
Chris@49
|
770 memory::mark_as_aligned(dest);
|
Chris@49
|
771
|
Chris@49
|
772 uword i,j;
|
Chris@49
|
773
|
Chris@49
|
774 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
775 {
|
Chris@49
|
776 dest[i] /= val;
|
Chris@49
|
777 dest[j] /= val;
|
Chris@49
|
778 }
|
Chris@49
|
779
|
Chris@49
|
780 if(i < n_elem)
|
Chris@49
|
781 {
|
Chris@49
|
782 dest[i] /= val;
|
Chris@49
|
783 }
|
Chris@49
|
784 }
|
Chris@49
|
785 else
|
Chris@49
|
786 {
|
Chris@49
|
787 uword i,j;
|
Chris@49
|
788
|
Chris@49
|
789 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
790 {
|
Chris@49
|
791 dest[i] /= val;
|
Chris@49
|
792 dest[j] /= val;
|
Chris@49
|
793 }
|
Chris@49
|
794
|
Chris@49
|
795 if(i < n_elem)
|
Chris@49
|
796 {
|
Chris@49
|
797 dest[i] /= val;
|
Chris@49
|
798 }
|
Chris@49
|
799 }
|
Chris@49
|
800 }
|
Chris@49
|
801
|
Chris@49
|
802
|
Chris@49
|
803
|
Chris@49
|
804 template<typename eT>
|
Chris@49
|
805 arma_hot
|
Chris@49
|
806 arma_pure
|
Chris@49
|
807 inline
|
Chris@49
|
808 eT
|
Chris@49
|
809 arrayops::accumulate(const eT* src, const uword n_elem)
|
Chris@49
|
810 {
|
Chris@49
|
811 uword i,j;
|
Chris@49
|
812
|
Chris@49
|
813 eT acc1 = eT(0);
|
Chris@49
|
814 eT acc2 = eT(0);
|
Chris@49
|
815
|
Chris@49
|
816 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
817 {
|
Chris@49
|
818 acc1 += src[i];
|
Chris@49
|
819 acc2 += src[j];
|
Chris@49
|
820 }
|
Chris@49
|
821
|
Chris@49
|
822 if(i < n_elem)
|
Chris@49
|
823 {
|
Chris@49
|
824 acc1 += src[i];
|
Chris@49
|
825 }
|
Chris@49
|
826
|
Chris@49
|
827 return acc1 + acc2;
|
Chris@49
|
828 }
|
Chris@49
|
829
|
Chris@49
|
830
|
Chris@49
|
831
|
Chris@49
|
832 template<typename eT>
|
Chris@49
|
833 arma_hot
|
Chris@49
|
834 arma_pure
|
Chris@49
|
835 inline
|
Chris@49
|
836 eT
|
Chris@49
|
837 arrayops::product(const eT* src, const uword n_elem)
|
Chris@49
|
838 {
|
Chris@49
|
839 eT val1 = eT(1);
|
Chris@49
|
840 eT val2 = eT(1);
|
Chris@49
|
841
|
Chris@49
|
842 uword i,j;
|
Chris@49
|
843
|
Chris@49
|
844 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
845 {
|
Chris@49
|
846 val1 *= src[i];
|
Chris@49
|
847 val2 *= src[j];
|
Chris@49
|
848 }
|
Chris@49
|
849
|
Chris@49
|
850 if(i < n_elem)
|
Chris@49
|
851 {
|
Chris@49
|
852 val1 *= src[i];
|
Chris@49
|
853 }
|
Chris@49
|
854
|
Chris@49
|
855 return val1 * val2;
|
Chris@49
|
856 }
|
Chris@49
|
857
|
Chris@49
|
858
|
Chris@49
|
859
|
Chris@49
|
860 template<typename eT>
|
Chris@49
|
861 arma_hot
|
Chris@49
|
862 arma_pure
|
Chris@49
|
863 inline
|
Chris@49
|
864 bool
|
Chris@49
|
865 arrayops::is_finite(const eT* src, const uword n_elem)
|
Chris@49
|
866 {
|
Chris@49
|
867 uword i,j;
|
Chris@49
|
868
|
Chris@49
|
869 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
870 {
|
Chris@49
|
871 const eT val_i = src[i];
|
Chris@49
|
872 const eT val_j = src[j];
|
Chris@49
|
873
|
Chris@49
|
874 if( (arma_isfinite(val_i) == false) || (arma_isfinite(val_j) == false) )
|
Chris@49
|
875 {
|
Chris@49
|
876 return false;
|
Chris@49
|
877 }
|
Chris@49
|
878 }
|
Chris@49
|
879
|
Chris@49
|
880 if(i < n_elem)
|
Chris@49
|
881 {
|
Chris@49
|
882 if(arma_isfinite(src[i]) == false)
|
Chris@49
|
883 {
|
Chris@49
|
884 return false;
|
Chris@49
|
885 }
|
Chris@49
|
886 }
|
Chris@49
|
887
|
Chris@49
|
888 return true;
|
Chris@49
|
889 }
|
Chris@49
|
890
|
Chris@49
|
891
|
Chris@49
|
892
|
Chris@49
|
893 // TODO: this function is currently not used
|
Chris@49
|
894 template<typename eT>
|
Chris@49
|
895 arma_hot
|
Chris@49
|
896 arma_pure
|
Chris@49
|
897 inline
|
Chris@49
|
898 typename get_pod_type<eT>::result
|
Chris@49
|
899 arrayops::norm_1(const eT* src, const uword n_elem)
|
Chris@49
|
900 {
|
Chris@49
|
901 typedef typename get_pod_type<eT>::result T;
|
Chris@49
|
902
|
Chris@49
|
903 T acc = T(0);
|
Chris@49
|
904
|
Chris@49
|
905 uword i,j;
|
Chris@49
|
906
|
Chris@49
|
907 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
908 {
|
Chris@49
|
909 acc += std::abs(src[i]);
|
Chris@49
|
910 acc += std::abs(src[j]);
|
Chris@49
|
911 }
|
Chris@49
|
912
|
Chris@49
|
913 if(i < n_elem)
|
Chris@49
|
914 {
|
Chris@49
|
915 acc += std::abs(src[i]);
|
Chris@49
|
916 }
|
Chris@49
|
917
|
Chris@49
|
918 return acc;
|
Chris@49
|
919 }
|
Chris@49
|
920
|
Chris@49
|
921
|
Chris@49
|
922
|
Chris@49
|
923 // TODO: this function is currently not used
|
Chris@49
|
924 template<typename eT>
|
Chris@49
|
925 arma_hot
|
Chris@49
|
926 arma_pure
|
Chris@49
|
927 inline
|
Chris@49
|
928 eT
|
Chris@49
|
929 arrayops::norm_2(const eT* src, const uword n_elem, const typename arma_not_cx<eT>::result* junk)
|
Chris@49
|
930 {
|
Chris@49
|
931 arma_ignore(junk);
|
Chris@49
|
932
|
Chris@49
|
933 eT acc = eT(0);
|
Chris@49
|
934
|
Chris@49
|
935 uword i,j;
|
Chris@49
|
936
|
Chris@49
|
937 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
938 {
|
Chris@49
|
939 const eT tmp_i = src[i];
|
Chris@49
|
940 const eT tmp_j = src[j];
|
Chris@49
|
941
|
Chris@49
|
942 acc += tmp_i * tmp_i;
|
Chris@49
|
943 acc += tmp_j * tmp_j;
|
Chris@49
|
944 }
|
Chris@49
|
945
|
Chris@49
|
946 if(i < n_elem)
|
Chris@49
|
947 {
|
Chris@49
|
948 const eT tmp_i = src[i];
|
Chris@49
|
949
|
Chris@49
|
950 acc += tmp_i * tmp_i;
|
Chris@49
|
951 }
|
Chris@49
|
952
|
Chris@49
|
953 return std::sqrt(acc);
|
Chris@49
|
954 }
|
Chris@49
|
955
|
Chris@49
|
956
|
Chris@49
|
957
|
Chris@49
|
958 // TODO: this function is currently not used
|
Chris@49
|
959 template<typename T>
|
Chris@49
|
960 arma_hot
|
Chris@49
|
961 arma_pure
|
Chris@49
|
962 inline
|
Chris@49
|
963 T
|
Chris@49
|
964 arrayops::norm_2(const std::complex<T>* src, const uword n_elem)
|
Chris@49
|
965 {
|
Chris@49
|
966 T acc = T(0);
|
Chris@49
|
967
|
Chris@49
|
968 uword i,j;
|
Chris@49
|
969
|
Chris@49
|
970 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
971 {
|
Chris@49
|
972 const T tmp_i = std::abs(src[i]);
|
Chris@49
|
973 const T tmp_j = std::abs(src[j]);
|
Chris@49
|
974
|
Chris@49
|
975 acc += tmp_i * tmp_i;
|
Chris@49
|
976 acc += tmp_j * tmp_j;
|
Chris@49
|
977 }
|
Chris@49
|
978
|
Chris@49
|
979 if(i < n_elem)
|
Chris@49
|
980 {
|
Chris@49
|
981 const T tmp_i = std::abs(src[i]);
|
Chris@49
|
982
|
Chris@49
|
983 acc += tmp_i * tmp_i;
|
Chris@49
|
984 }
|
Chris@49
|
985
|
Chris@49
|
986 return std::sqrt(acc);
|
Chris@49
|
987 }
|
Chris@49
|
988
|
Chris@49
|
989
|
Chris@49
|
990
|
Chris@49
|
991 // TODO: this function is currently not used
|
Chris@49
|
992 template<typename eT>
|
Chris@49
|
993 arma_hot
|
Chris@49
|
994 arma_pure
|
Chris@49
|
995 inline
|
Chris@49
|
996 typename get_pod_type<eT>::result
|
Chris@49
|
997 arrayops::norm_k(const eT* src, const uword n_elem, const int k)
|
Chris@49
|
998 {
|
Chris@49
|
999 typedef typename get_pod_type<eT>::result T;
|
Chris@49
|
1000
|
Chris@49
|
1001 T acc = T(0);
|
Chris@49
|
1002
|
Chris@49
|
1003 uword i,j;
|
Chris@49
|
1004
|
Chris@49
|
1005 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
1006 {
|
Chris@49
|
1007 acc += std::pow(std::abs(src[i]), k);
|
Chris@49
|
1008 acc += std::pow(std::abs(src[j]), k);
|
Chris@49
|
1009 }
|
Chris@49
|
1010
|
Chris@49
|
1011 if(i < n_elem)
|
Chris@49
|
1012 {
|
Chris@49
|
1013 acc += std::pow(std::abs(src[i]), k);
|
Chris@49
|
1014 }
|
Chris@49
|
1015
|
Chris@49
|
1016 return std::pow(acc, T(1)/T(k));
|
Chris@49
|
1017 }
|
Chris@49
|
1018
|
Chris@49
|
1019
|
Chris@49
|
1020
|
Chris@49
|
1021 // TODO: this function is currently not used
|
Chris@49
|
1022 template<typename eT>
|
Chris@49
|
1023 arma_hot
|
Chris@49
|
1024 arma_pure
|
Chris@49
|
1025 inline
|
Chris@49
|
1026 typename get_pod_type<eT>::result
|
Chris@49
|
1027 arrayops::norm_max(const eT* src, const uword n_elem)
|
Chris@49
|
1028 {
|
Chris@49
|
1029 typedef typename get_pod_type<eT>::result T;
|
Chris@49
|
1030
|
Chris@49
|
1031 T max_val = std::abs(src[0]);
|
Chris@49
|
1032
|
Chris@49
|
1033 uword i,j;
|
Chris@49
|
1034
|
Chris@49
|
1035 for(i=1, j=2; j<n_elem; i+=2, j+=2)
|
Chris@49
|
1036 {
|
Chris@49
|
1037 const T tmp_i = std::abs(src[i]);
|
Chris@49
|
1038 const T tmp_j = std::abs(src[j]);
|
Chris@49
|
1039
|
Chris@49
|
1040 if(max_val < tmp_i) { max_val = tmp_i; }
|
Chris@49
|
1041 if(max_val < tmp_j) { max_val = tmp_j; }
|
Chris@49
|
1042 }
|
Chris@49
|
1043
|
Chris@49
|
1044 if(i < n_elem)
|
Chris@49
|
1045 {
|
Chris@49
|
1046 const T tmp_i = std::abs(src[i]);
|
Chris@49
|
1047
|
Chris@49
|
1048 if(max_val < tmp_i) { max_val = tmp_i; }
|
Chris@49
|
1049 }
|
Chris@49
|
1050
|
Chris@49
|
1051 return max_val;
|
Chris@49
|
1052 }
|
Chris@49
|
1053
|
Chris@49
|
1054
|
Chris@49
|
1055
|
Chris@49
|
1056 // TODO: this function is currently not used
|
Chris@49
|
1057 template<typename eT>
|
Chris@49
|
1058 arma_hot
|
Chris@49
|
1059 arma_pure
|
Chris@49
|
1060 inline
|
Chris@49
|
1061 typename get_pod_type<eT>::result
|
Chris@49
|
1062 arrayops::norm_min(const eT* src, const uword n_elem)
|
Chris@49
|
1063 {
|
Chris@49
|
1064 typedef typename get_pod_type<eT>::result T;
|
Chris@49
|
1065
|
Chris@49
|
1066 T min_val = std::abs(src[0]);
|
Chris@49
|
1067
|
Chris@49
|
1068 uword i,j;
|
Chris@49
|
1069
|
Chris@49
|
1070 for(i=1, j=2; j<n_elem; i+=2, j+=2)
|
Chris@49
|
1071 {
|
Chris@49
|
1072 const T tmp_i = std::abs(src[i]);
|
Chris@49
|
1073 const T tmp_j = std::abs(src[j]);
|
Chris@49
|
1074
|
Chris@49
|
1075 if(min_val > tmp_i) { min_val = tmp_i; }
|
Chris@49
|
1076 if(min_val > tmp_j) { min_val = tmp_j; }
|
Chris@49
|
1077 }
|
Chris@49
|
1078
|
Chris@49
|
1079 if(i < n_elem)
|
Chris@49
|
1080 {
|
Chris@49
|
1081 const T tmp_i = std::abs(src[i]);
|
Chris@49
|
1082
|
Chris@49
|
1083 if(min_val > tmp_i) { min_val = tmp_i; }
|
Chris@49
|
1084 }
|
Chris@49
|
1085
|
Chris@49
|
1086 return min_val;
|
Chris@49
|
1087 }
|
Chris@49
|
1088
|
Chris@49
|
1089
|
Chris@49
|
1090
|
Chris@49
|
1091 //! @}
|