PICCANTE  0.4
The hottest HDR imaging library!
array.hpp
Go to the documentation of this file.
1 /*
2 
3 PICCANTE
4 The hottest HDR imaging library!
5 http://vcg.isti.cnr.it/piccante
6 
7 Copyright (C) 2014
8 Visual Computing Laboratory - ISTI CNR
9 http://vcg.isti.cnr.it
10 First author: Francesco Banterle
11 
12 This Source Code Form is subject to the terms of the Mozilla Public
13 License, v. 2.0. If a copy of the MPL was not distributed with this
14 file, You can obtain one at http://mozilla.org/MPL/2.0/.
15 
16 */
17 
18 #ifndef PIC_UTIL_ARRAY_HPP
19 #define PIC_UTIL_ARRAY_HPP
20 
21 #include <vector>
22 #include <math.h>
23 
24 namespace pic {
25 
29 template<class T>
30 class Array
31 {
32 protected:
33  bool bShallow;
34 
35 public:
36  T *data;
37  int nData;
38 
43  {
44  bShallow = false;
45  data = NULL;
46  nData = -1;
47  }
48 
53  Array(int n)
54  {
55  bShallow = false;
56  data = NULL;
57  allocate(n);
58  }
59 
66  Array(T *data, int nData, bool bShallow)
67  {
68  this->nData = nData;
69 
70  if(bShallow) {
71  this->data = data;
72  this->bShallow = bShallow;
73  } else {
74  this->data = new T[nData];
75  memcpy(this->data, data, sizeof(T) * nData);
76  }
77  }
78 
80  {
81  release();
82  }
83 
88  void allocate(int n)
89  {
90  if(n < 1) {
91  return;
92  }
93 
94  if((data != NULL) && (!bShallow)) {
95  delete[] data;
96  }
97 
98  data = new T[n];
99  this->nData = n;
100  bShallow = false;
101  }
102 
106  void release()
107  {
108  if(nData > 0 && data != NULL && !bShallow) {
109  delete[] data;
110  data = NULL;
111  nData = -1;
112  }
113  }
114 
120  {
121  Array<T> *out = new Array<T>(nData);
122  memcpy(this->data, data, sizeof(T) * nData);
123  }
124 
132  static T* genValue(T value, int n, T *ret)
133  {
134  if(n < 1) {
135  return ret;
136  }
137 
138  if(ret == NULL) {
139  ret = new T[n];
140  }
141 
142  for(int i = 0; i < n; i++) {
143  ret[i] = value;
144  }
145 
146  return ret;
147  }
148 
156  static T *genRange(T minVal, T step, T maxVal, T *ret, int &n)
157  {
158  n = int((maxVal - minVal) / step) + 1;
159 
160  if(ret == NULL) {
161  ret = new T[n];
162  }
163 
164  ret[0] = minVal;
165  for(int i = 1; i < n; i++) {
166  ret[i] = ret[i - 1] + step;
167  }
168 
169  return ret;
170  }
171 
180  static T *linspace(T minVal, T maxVal, int n, T *ret)
181  {
182  T step = (maxVal - minVal) / (n - 1);
183  int tmp = n;
184 
185  return genRange(minVal, step, maxVal, ret, tmp);
186  }
187 
195  static T distanceSq(T *data0, T *data1, int n)
196  {
197  T tmp = data0[0] - data1[0];
198  T distSq = tmp * tmp;
199 
200  for(int k = 1; k < n; k++) {
201  tmp = data0[k] - data1[k];
202  distSq += tmp * tmp;
203  }
204 
205  return distSq;
206  }
207 
213  static T* zeros(int n)
214  {
215  T *ret = new T[n];
216  assign(T(0), ret, n);
217 
218  return ret;
219  }
220 
227  static T norm_sq(float *data, int n)
228  {
229  T n_sq = data[0] * data[0];
230 
231  for(int k = 1; k < n; k++) {
232  T tmp = data[k];
233  n_sq += tmp * tmp;
234  }
235 
236  return n_sq;
237  }
238 
245  static T norm(float *data, int n)
246  {
247  return sqrtf(Array<float>::norm(data, n));
248  }
249 
257  static float normalize(float *data, int n, float norm_sq = -1.0f)
258  {
259  if(norm_sq < 0.0f) {
261  }
262 
263  if(norm_sq > 0.0f) {
264  norm_sq = sqrtf(norm_sq);
265 
266  for(int k = 0; k < n; k++) {
267  data[k] /= norm_sq;
268  }
269  }
270 
271  return norm_sq;
272  }
273 
281  static T dot(T *data0, T *data1, int n)
282  {
283  T out = data0[0] * data1[0];
284 
285  for(int k = 1; k < n; k++) {
286  out += data0[k] * data1[k];
287  }
288 
289  return out;
290  }
291 
299  static void mul(T *data, int size, T scale)
300  {
301  if(data == NULL || size < 1) {
302  return;
303  }
304 
305  for(int i = 0; i < size; i++) {
306  data[i] *= scale;
307  }
308  }
309 
317  static void mul(T *data, int size, T *ret)
318  {
319  if(data == NULL || size < 1 || ret == NULL) {
320  return;
321  }
322 
323  for(int i = 0; i < size; i++) {
324  ret[i] *= data[i];
325  }
326  }
327 
334  static T* add(T *data, int size, T *ret)
335  {
336  if(data == NULL || ret == NULL || size < 1) {
337  return ret;
338  }
339 
340  for(int i = 0; i < size; i++) {
341  ret[i] += data[i];
342  }
343 
344  return ret;
345  }
346 
353  static void div(T *data, int size, T value)
354  {
355  for(int i = 0; i < size; i++) {
356  data[i] /= value;
357  }
358  }
359 
367  static T getMean(T *data, int size)
368  {
369  if(data == NULL || size < 1) {
370  return T(0);
371  }
372 
373  T ret = data[0];
374 
375  for(int i = 1; i < size; i++) {
376  ret += data[i];
377  }
378 
379  ret /= T(size);
380 
381  return ret;
382  }
383 
390  static T getVariance(T *data, int size)
391  {
392  if(data == NULL || size < 2) {
393  return T(-1);
394  }
395 
396  T mu = getMean(data, size);
397 
398  T tmp = data[0] - mu;
399  T ret = tmp * tmp;
400 
401  for(int i = 1; i < size; i++) {
402  tmp = data[i] - mu;
403  ret += tmp * tmp;
404  }
405 
406  size--;
407  return ret / T(size);
408  }
409 
416  static T sum(T *data, int size)
417  {
418  if(data == NULL || size < 1) {
419  return T(0);
420  }
421 
422  T ret = data[0];
423 
424  for(int i = 1; i < size; i++) {
425  ret += data[i];
426  }
427 
428  return ret;
429  }
430 
438  static T *cumsum(T *vec, int size, T *ret)
439  {
440  if(vec == NULL || size < 1) {
441  return NULL;
442  }
443 
444  if(ret == NULL) {
445  ret = new T[size];
446  }
447 
448  ret[0] = vec[0];
449 
450  for(int i = 1; i < size; i++) {
451  ret[i] = vec[i] + ret[i - 1];
452  }
453 
454  return ret;
455  }
456 
464  static T* assign (T* data, int size, T* ret)
465  {
466  memcpy(ret, data, sizeof(T) * size);
467  return ret;
468  }
469 
477  static T* assign (T data, T* ret, int size)
478  {
479  for(int i = 0; i < size; i++) {
480  ret[i] = data;
481  }
482  return ret;
483  }
484 
492  static T* apply(T *data, int size, T *ret, T(*func)(T))
493  {
494  if(data == NULL || size < 1) {
495  return ret;
496  }
497 
498  if(ret == NULL) {
499  ret = new T[size];
500  }
501 
502  for(int i = 1; i < size; i++) {
503  ret[i] = func(data[i]);
504  }
505 
506  return ret;
507  }
508 
516  static T getMax(T *data, int size, int &ind)
517  {
518  if(data == NULL || size < 1) {
519  return T(size + 1);
520  }
521 
522  T ret = data[0];
523  ind = 0;
524 
525  for(int i = 1; i < size; i++) {
526  if(ret < data[i]) {
527  ret = data[i];
528  ind = i;
529  }
530  }
531 
532  return ret;
533  }
534 
542  static T getMin(T *data, int size, int &ind)
543  {
544  if(data == NULL || size < 1) {
545  return T(size + 1);
546  }
547 
548  T ret = data[0];
549  ind = 0;
550 
551  for(int i = 1; i < size; i++) {
552  if(ret > data[i]) {
553  ret = data[i];
554  ind = i;
555  }
556  }
557 
558  return ret;
559  }
560 
569  static T interp(T *x, T *y, int size, T xval)
570  {
571  int sm1 = size - 1;
572  if((xval >= x[0]) && (xval <= x[sm1])) {
573  int offset2;
574  T *ptr = std::lower_bound(&x[0], &x[sm1], xval);
575  int offset = MAX(0, (int)(ptr - x - 1));
576 
577  if(offset == sm1) {
578  offset2 = offset;
579  offset = offset2 - 1;
580  } else {
581  offset2 = MIN(size - 1, offset + 1);
582  }
583 
584  T t = (xval - x[offset]) / (x[offset2] - x[offset]);
585 
586  return y[offset] * (T(1) - t) + t * y[offset2];
587  } else {
588  if(xval > x[sm1]) {
589  int sm2 = size - 2;
590  T t = (xval - x[sm2]) / (x[sm1] - x[sm2]);
591  return t * (y[sm1] - y[sm2]) + y[sm2];
592  } else {
593  T t = (xval - x[0]) / (x[1] - x[0]);
594  return t * (y[1] - y[0]) + y[0];
595  }
596  }
597 
598  }
599 
608  static int binSearchLeft(T *data, T key, int low, int high)
609  {
610  if( (high < low) ||
611  (key > data[high - 1]) ||
612  (key < data[low]) ) {
613 
614  #ifdef PIC_DEBUG
615  printf("\nbinSearchLeft: bounds error!\n");
616  #endif
617  return -1;
618  }
619 
620  int mid;
621  while(low < high) {
622  mid = (low + high) / 2;
623 
624  if(data[mid] < key) {
625  low = mid + 1;
626  } else {
627  high = mid;
628  }
629 
630  }
631 
632  if (low > 0) {
633  low--;
634  }
635 
636  return low;
637  }
638 };
639 
644 
649 
654 
655 } // end namespace pic
656 
657 #endif /* PIC_UTIL_ARRAY_HPP */
658 
static T getMax(T *data, int size, int &ind)
getMax
Definition: array.hpp:516
static T * genRange(T minVal, T step, T maxVal, T *ret, int &n)
genRange
Definition: array.hpp:156
static T * apply(T *data, int size, T *ret, T(*func)(T))
apply
Definition: array.hpp:492
Array< float > Arrayf
Arrayf.
Definition: array.hpp:643
static float normalize(float *data, int n, float norm_sq=-1.0f)
normalize
Definition: array.hpp:257
static T * linspace(T minVal, T maxVal, int n, T *ret)
linspace
Definition: array.hpp:180
static T interp(T *x, T *y, int size, T xval)
interp linearly interpolates x and y data
Definition: array.hpp:569
static T getMean(T *data, int size)
getMean
Definition: array.hpp:367
static T * genValue(T value, int n, T *ret)
genValue
Definition: array.hpp:132
static T * zeros(int n)
zeros
Definition: array.hpp:213
Array< T > * clone()
clone
Definition: array.hpp:119
static T distanceSq(T *data0, T *data1, int n)
distanceSq
Definition: array.hpp:195
static void mul(T *data, int size, T *ret)
mul
Definition: array.hpp:317
Array< int > Arrayi
Arrayi.
Definition: array.hpp:648
Array< unsigned int > Arrayui
Arrayui.
Definition: array.hpp:653
static void mul(T *data, int size, T scale)
mul
Definition: array.hpp:299
Array(int n)
Array.
Definition: array.hpp:53
int nData
Definition: array.hpp:37
static T sum(T *data, int size)
sum
Definition: array.hpp:416
bool bShallow
Definition: array.hpp:33
static T getMin(T *data, int size, int &ind)
getMin
Definition: array.hpp:542
static T * cumsum(T *vec, int size, T *ret)
cumsum
Definition: array.hpp:438
static T dot(T *data0, T *data1, int n)
dot
Definition: array.hpp:281
#define MIN(a, b)
Definition: math.hpp:69
Array(T *data, int nData, bool bShallow)
Array.
Definition: array.hpp:66
static T * assign(T data, T *ret, int size)
assign
Definition: array.hpp:477
T * data
Definition: array.hpp:36
static void div(T *data, int size, T value)
div
Definition: array.hpp:353
static T getVariance(T *data, int size)
getVariance
Definition: array.hpp:390
The Array class.
Definition: array.hpp:30
Definition: bilateral_separation.hpp:25
static T * assign(T *data, int size, T *ret)
assign
Definition: array.hpp:464
#define MAX(a, b)
Definition: math.hpp:73
static T norm(float *data, int n)
norm
Definition: array.hpp:245
static T * add(T *data, int size, T *ret)
add
Definition: array.hpp:334
static T norm_sq(float *data, int n)
norm_sq
Definition: array.hpp:227
~Array()
Definition: array.hpp:79
Array()
Array.
Definition: array.hpp:42
static int binSearchLeft(T *data, T key, int low, int high)
binSearchLeft
Definition: array.hpp:608
void allocate(int n)
allocate
Definition: array.hpp:88
void release()
release
Definition: array.hpp:106