vnl_block.h
Go to the documentation of this file.
1 // This is core/vnl/vnl_block.h
2 #ifndef vnl_block_h_
3 #define vnl_block_h_
4 //:
5 // \file
6 // \author fsm
7 //
8 // \verbatim
9 // Modifications
10 // 2009-03-30 Peter Vanroose - Added arg_min() & arg_max() and reimplemented min_value() & max_value()
11 // \endverbatim
12 //
13 #ifdef _MSC_VER
14 # include <vcl_msvc_warnings.h>
15 #endif
16 #include "vnl/vnl_export.h"
17 
18 VNL_EXPORT void vnl_block_raise_exception(char const *FILE, int LINE, char const *why);
19 
20 //: return sum of elements
21 template <class T> inline
22 T vnl_block_sum(T const x[], unsigned n)
23 {
24  if (n == 0)
25  return T(0);
26  else {
27  T ans = x[0];
28  for (unsigned i=1; i<n; ++i)
29  ans += x[i];
30  return ans;
31  }
32 }
33 
34 //: return product of elements
35 template <class T> inline
36 T vnl_block_product(T const x[], unsigned n)
37 {
38  if (n == 0)
39  return T(1);
40  else {
41  T ans = x[0];
42  for (unsigned i=1; i<n; ++i)
43  ans *= x[i];
44  return ans;
45  }
46 }
47 
48 //: return smallest value.
49 template <class T> inline
50 T vnl_block_min_value(T const *x, unsigned n)
51 {
52  if (n == 0)
53  vnl_block_raise_exception(__FILE__, __LINE__, "n is 0");
54  T ans = *x;
55  while (--n > 0)
56  if (ans > *++x)
57  ans = *x;
58  return ans;
59 }
60 
61 //: return largest value.
62 template <class T> inline
63 T vnl_block_max_value(T const *x, unsigned n)
64 {
65  if (n == 0)
66  vnl_block_raise_exception(__FILE__, __LINE__, "n is 0");
67  T ans = *x;
68  while (--n > 0)
69  if (ans < *++x)
70  ans = *x;
71  return ans;
72 }
73 
74 //: return index of smallest value.
75 template <class T> inline
76 unsigned vnl_block_arg_min(T const x[], unsigned n)
77 {
78  if (n == 0)
79  vnl_block_raise_exception(__FILE__, __LINE__, "n is 0");
80  T tmp = *x;
81  unsigned idx = 0;
82  for (unsigned i=1; i<n; ++i)
83  if (tmp > *++x)
84  tmp = *x, idx = i;
85  return idx;
86 }
87 
88 //: return index of largest value.
89 template <class T> inline
90 unsigned vnl_block_arg_max(T const x[], unsigned n)
91 {
92  if (n == 0)
93  vnl_block_raise_exception(__FILE__, __LINE__, "n is 0");
94  T tmp = *x;
95  unsigned idx = 0;
96  for (unsigned i=1; i<n; ++i)
97  if (tmp < *++x)
98  tmp = *x, idx = i;
99  return idx;
100 }
101 
102 //: y[i] = x[i]
103 template <class T> inline
104 void vnl_block_copy(T const x[], T y[], unsigned n)
105 {
106  for (unsigned i=0; i<n; ++i)
107  y[i] = x[i];
108 }
109 
110 //: reverses sequence
111 template <class T> inline
112 void vnl_block_reverse(T x[], unsigned n)
113 {
114  T tmp;
115  for (unsigned i=0; 2*i<n; ++i) {
116  tmp = x[i];
117  x[i] = x[n-1-i];
118  x[n-1-i] = tmp;
119  }
120 }
121 
122 //: x[i] *= a
123 template <class T> inline
124 void vnl_block_scale(T a, T x[], unsigned n)
125 {
126  for (unsigned i=0; i<n; ++i)
127  x[i] *= a;
128 }
129 
130 //: y[i] = a * x[i]
131 template <class T> inline
132 void vnl_block_scale(T a, T const x[], T y[], unsigned n)
133 {
134  for (unsigned i=0; i<n; ++i)
135  y[i] = a * x[i];
136 }
137 
138 //: y[i] += x[i]
139 template <class T> inline
140 void vnl_block_add(T const x[], T y[], unsigned n)
141 {
142  for (unsigned i=0; i<n; ++i)
143  y[i] += x[i];
144 }
145 
146 //: z[i] = x[i] + y[i]
147 template <class T> inline
148 void vnl_block_add(T const x[], T const y[], T z[], unsigned n)
149 {
150  for (unsigned i=0; i<n; ++i)
151  z[i] = x[i] + y[i];
152 }
153 
154 //: z[i] = x[i] - y[i]
155 template <class T> inline
156 void vnl_block_sub(T const x[], T const y[], T z[], unsigned n)
157 {
158  for (unsigned i=0; i<n; ++i)
159  z[i] = x[i] - y[i];
160 }
161 
162 //: y[i] *= x[i]
163 template <class T> inline
164 void vnl_block_mul(T const x[], T y[], unsigned n)
165 {
166  for (unsigned i=0; i<n; ++i)
167  y[i] *= x[i];
168 }
169 
170 //: z[i] = x[i] * y[i]
171 template <class T> inline
172 void vnl_block_mul(T const x[], T const y[], T z[], unsigned n)
173 {
174  for (unsigned i=0; i<n; ++i)
175  z[i] = x[i] * y[i];
176 }
177 
178 //: z[i] = x[i] / y[i]
179 template <class T> inline
180 void vnl_block_div(T const x[], T const y[], T z[], unsigned n)
181 {
182  for (unsigned i=0; i<n; ++i)
183  z[i] = x[i] / y[i];
184 }
185 
186 //: y[i] = -x[i]
187 template <class T> inline
188 void vnl_block_negate(T const x[], T y[], unsigned n)
189 {
190  for (unsigned i=0; i<n; ++i)
191  y[i] = - x[i];
192 }
193 
194 //: y[i] = 1/x[i]
195 template <class T> inline
196 void vnl_block_invert(T const x[], T y[], unsigned n)
197 {
198  for (unsigned i=0; i<n; ++i)
199  y[i] = T(1) / x[i];
200 }
201 
202 //: y[i] += a * x[i]
203 template <class T> inline
204 void vnl_block_axpy(T a, T const x[], T y[], unsigned n)
205 {
206  for (unsigned i=0; i<n; ++i)
207  y[i] += a * x[i];
208 }
209 
210 //: x[i] = v
211 template <class T> inline
212 void vnl_block_fill(T x[], unsigned n, T value)
213 {
214  for (unsigned i=0; i<n; ++i)
215  x[i] = value;
216 }
217 
218 #endif // vnl_block_h_
void vnl_block_negate(T const x[], T y[], unsigned n)
y[i] = -x[i].
Definition: vnl_block.h:188
T vnl_block_product(T const x[], unsigned n)
return product of elements.
Definition: vnl_block.h:36
void vnl_block_sub(T const x[], T const y[], T z[], unsigned n)
z[i] = x[i] - y[i].
Definition: vnl_block.h:156
void vnl_block_invert(T const x[], T y[], unsigned n)
y[i] = 1/x[i].
Definition: vnl_block.h:196
unsigned vnl_block_arg_max(T const x[], unsigned n)
return index of largest value.
Definition: vnl_block.h:90
void vnl_block_axpy(T a, T const x[], T y[], unsigned n)
y[i] += a * x[i].
Definition: vnl_block.h:204
void vnl_block_mul(T const x[], T y[], unsigned n)
y[i] *= x[i].
Definition: vnl_block.h:164
void vnl_block_fill(T x[], unsigned n, T value)
x[i] = v.
Definition: vnl_block.h:212
VNL_EXPORT void vnl_block_raise_exception(char const *FILE, int LINE, char const *why)
Definition: vnl_block.cxx:9
void vnl_block_scale(T a, T x[], unsigned n)
x[i] *= a.
Definition: vnl_block.h:124
void vnl_block_add(T const x[], T y[], unsigned n)
y[i] += x[i].
Definition: vnl_block.h:140
T vnl_block_max_value(T const *x, unsigned n)
return largest value.
Definition: vnl_block.h:63
void vnl_block_div(T const x[], T const y[], T z[], unsigned n)
z[i] = x[i] / y[i].
Definition: vnl_block.h:180
T vnl_block_sum(T const x[], unsigned n)
return sum of elements.
Definition: vnl_block.h:22
void vnl_block_copy(T const x[], T y[], unsigned n)
y[i] = x[i].
Definition: vnl_block.h:104
unsigned vnl_block_arg_min(T const x[], unsigned n)
return index of smallest value.
Definition: vnl_block.h:76
T vnl_block_min_value(T const *x, unsigned n)
return smallest value.
Definition: vnl_block.h:50
void vnl_block_reverse(T x[], unsigned n)
reverses sequence.
Definition: vnl_block.h:112