Mercurial > hg > octave-nkf
annotate liboctave/intNDArray.cc @ 7784:d3a7882fa0b3
style fixes
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Tue, 20 May 2008 16:24:50 -0400 |
parents | 36594d5bbe13 |
children | 008f3985c8c0 |
rev | line source |
---|---|
4902 | 1 // N-D Array manipulations. |
2 /* | |
3 | |
7017 | 4 Copyright (C) 2004, 2005, 2006, 2007 John W. Eaton |
4902 | 5 |
6 This file is part of Octave. | |
7 | |
8 Octave is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
7016 | 10 Free Software Foundation; either version 3 of the License, or (at your |
11 option) any later version. | |
4902 | 12 |
13 Octave is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
7016 | 19 along with Octave; see the file COPYING. If not, see |
20 <http://www.gnu.org/licenses/>. | |
4902 | 21 |
22 */ | |
23 | |
24 #ifdef HAVE_CONFIG_H | |
25 #include <config.h> | |
26 #endif | |
27 | |
28 #include "Array-util.h" | |
29 #include "mx-base.h" | |
30 #include "lo-ieee.h" | |
31 | |
32 // unary operations | |
33 | |
34 template <class T> | |
35 boolNDArray | |
36 intNDArray<T>::operator ! (void) const | |
37 { | |
4932 | 38 boolNDArray b (this->dims ()); |
4902 | 39 |
5275 | 40 for (octave_idx_type i = 0; i < this->length (); i++) |
4932 | 41 b.elem (i) = ! this->elem (i); |
4902 | 42 |
43 return b; | |
44 } | |
45 | |
5943 | 46 template <class T> |
47 bool | |
48 intNDArray<T>::any_element_not_one_or_zero (void) const | |
49 { | |
50 octave_idx_type nel = this->nelem (); | |
51 | |
52 for (octave_idx_type i = 0; i < nel; i++) | |
53 { | |
54 T val = this->elem (i); | |
55 | |
56 if (val != 0.0 && val != 1.0) | |
57 return true; | |
58 } | |
59 | |
60 return false; | |
61 } | |
62 | |
6979 | 63 template <class T> |
64 intNDArray<T> | |
65 intNDArray<T>::diag (octave_idx_type k) const | |
66 { | |
7620
36594d5bbe13
Move diag function into the octave_value class
David Bateman <dbateman@free.fr>
parents:
7600
diff
changeset
|
67 return MArrayN<T>::diag (k); |
6979 | 68 } |
69 | |
5775 | 70 // FIXME -- this is not quite the right thing. |
4902 | 71 |
72 template <class T> | |
73 boolNDArray | |
74 intNDArray<T>::all (int dim) const | |
75 { | |
4932 | 76 MX_ND_ANY_ALL_REDUCTION (MX_ND_ALL_EVAL (this->elem (iter_idx) == T (0)), true); |
4902 | 77 } |
78 | |
79 template <class T> | |
80 boolNDArray | |
81 intNDArray<T>::any (int dim) const | |
82 { | |
7457 | 83 MX_ND_ANY_ALL_REDUCTION (MX_ND_ANY_EVAL (this->elem (iter_idx) != T (0)), false); |
4902 | 84 } |
85 | |
86 template <class T> | |
87 void | |
5275 | 88 intNDArray<T>::increment_index (Array<octave_idx_type>& ra_idx, |
4902 | 89 const dim_vector& dimensions, |
90 int start_dimension) | |
91 { | |
92 ::increment_index (ra_idx, dimensions, start_dimension); | |
93 } | |
94 | |
95 template <class T> | |
5275 | 96 octave_idx_type |
97 intNDArray<T>::compute_index (Array<octave_idx_type>& ra_idx, | |
4902 | 98 const dim_vector& dimensions) |
99 { | |
100 return ::compute_index (ra_idx, dimensions); | |
101 } | |
102 | |
4915 | 103 template <class T> |
5073 | 104 intNDArray<T> |
5275 | 105 intNDArray<T>::concat (const intNDArray<T>& rb, const Array<octave_idx_type>& ra_idx) |
5073 | 106 { |
6482 | 107 if (rb.numel () > 0) |
5073 | 108 insert (rb, ra_idx); |
109 return *this; | |
110 } | |
111 | |
112 template <class T> | |
4915 | 113 intNDArray<T>& |
5275 | 114 intNDArray<T>::insert (const intNDArray<T>& a, octave_idx_type r, octave_idx_type c) |
4915 | 115 { |
116 Array<T>::insert (a, r, c); | |
117 return *this; | |
118 } | |
119 | |
120 template <class T> | |
121 intNDArray<T>& | |
5275 | 122 intNDArray<T>::insert (const intNDArray<T>& a, const Array<octave_idx_type>& ra_idx) |
4915 | 123 { |
124 Array<T>::insert (a, ra_idx); | |
125 return *this; | |
126 } | |
127 | |
4902 | 128 // This contains no information on the array structure !!! |
129 | |
130 template <class T> | |
131 std::ostream& | |
132 operator << (std::ostream& os, const intNDArray<T>& a) | |
133 { | |
5275 | 134 octave_idx_type nel = a.nelem (); |
4902 | 135 |
5275 | 136 for (octave_idx_type i = 0; i < nel; i++) |
4902 | 137 os << " " << a.elem (i) << "\n"; |
138 | |
139 return os; | |
140 } | |
141 | |
142 template <class T> | |
143 std::istream& | |
144 operator >> (std::istream& is, intNDArray<T>& a) | |
145 { | |
5275 | 146 octave_idx_type nel = a.nelem (); |
4902 | 147 |
148 if (nel < 1 ) | |
149 is.clear (std::ios::badbit); | |
150 else | |
151 { | |
152 T tmp; | |
153 | |
5275 | 154 for (octave_idx_type i = 0; i < nel; i++) |
4902 | 155 { |
156 is >> tmp; | |
157 | |
158 if (is) | |
159 a.elem (i) = tmp; | |
160 else | |
161 goto done; | |
162 } | |
163 } | |
164 | |
165 done: | |
166 | |
167 return is; | |
168 } | |
169 | |
7503
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
170 // FIXME -- should abs and signum just be mapper functions? |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
171 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
172 template <class T> |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
173 intNDArray<T> |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
174 intNDArray<T>::abs (void) const |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
175 { |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
176 octave_idx_type nel = this->nelem (); |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
177 intNDArray<T> ret (*this); |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
178 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
179 for (octave_idx_type i = 0; i < nel; i++) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
180 { |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
181 T val = this->elem (i); |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
182 ret.xelem (i) = val.abs (); |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
183 } |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
184 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
185 return ret; |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
186 } |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
187 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
188 template <class T> |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
189 intNDArray<T> |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
190 intNDArray<T>::signum (void) const |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
191 { |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
192 octave_idx_type nel = this->nelem (); |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
193 intNDArray<T> ret (*this); |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
194 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
195 for (octave_idx_type i = 0; i < nel; i++) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
196 { |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
197 T val = this->elem (i); |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
198 ret.xelem (i) = val.signum (); |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
199 } |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
200 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
201 return ret; |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
202 } |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7457
diff
changeset
|
203 |
7113 | 204 template <class T> |
205 intNDArray<T> | |
206 intNDArray<T>::sum (int dim) const | |
207 { | |
208 MX_ND_REDUCTION (retval(result_idx) += intNDArray<T>::elem (iter_idx), 0, intNDArray<T>); | |
209 } | |
210 | |
7189 | 211 template <class T> |
212 intNDArray<T> | |
213 intNDArray<T>::max (int dim) const | |
214 { | |
215 ArrayN<octave_idx_type> dummy_idx; | |
216 return max (dummy_idx, dim); | |
217 } | |
218 | |
219 template <class T> | |
220 intNDArray<T> | |
221 intNDArray<T>::max (ArrayN<octave_idx_type>& idx_arg, int dim) const | |
222 { | |
223 dim_vector dv = this->dims (); | |
224 dim_vector dr = this->dims (); | |
225 | |
226 if (dv.numel () == 0 || dim > dv.length () || dim < 0) | |
227 return intNDArray<T> (); | |
228 | |
229 dr(dim) = 1; | |
230 | |
231 intNDArray<T> result (dr); | |
232 idx_arg.resize (dr); | |
233 | |
234 octave_idx_type x_stride = 1; | |
235 octave_idx_type x_len = dv(dim); | |
236 for (int i = 0; i < dim; i++) | |
237 x_stride *= dv(i); | |
238 | |
239 for (octave_idx_type i = 0; i < dr.numel (); i++) | |
240 { | |
241 octave_idx_type x_offset; | |
242 if (x_stride == 1) | |
243 x_offset = i * x_len; | |
244 else | |
245 { | |
246 octave_idx_type x_offset2 = 0; | |
247 x_offset = i; | |
248 while (x_offset >= x_stride) | |
249 { | |
250 x_offset -= x_stride; | |
251 x_offset2++; | |
252 } | |
253 x_offset += x_offset2 * x_stride * x_len; | |
254 } | |
255 | |
256 octave_idx_type idx_j = 0; | |
257 | |
258 T tmp_max = this->elem (x_offset); | |
259 | |
260 for (octave_idx_type j = 1; j < x_len; j++) | |
261 { | |
262 T tmp = this->elem (j * x_stride + x_offset); | |
263 | |
264 if (tmp > tmp_max) | |
265 { | |
266 idx_j = j; | |
267 tmp_max = tmp; | |
268 } | |
269 } | |
270 | |
271 result.elem (i) = tmp_max; | |
272 idx_arg.elem (i) = idx_j; | |
273 } | |
274 | |
7600
24abf5a702d9
Chop trailing singletons in min/max functions
David Bateman <dbateman@free.fr>
parents:
7503
diff
changeset
|
275 result.chop_trailing_singletons (); |
24abf5a702d9
Chop trailing singletons in min/max functions
David Bateman <dbateman@free.fr>
parents:
7503
diff
changeset
|
276 idx_arg.chop_trailing_singletons (); |
24abf5a702d9
Chop trailing singletons in min/max functions
David Bateman <dbateman@free.fr>
parents:
7503
diff
changeset
|
277 |
7189 | 278 return result; |
279 } | |
280 | |
281 template <class T> | |
282 intNDArray<T> | |
283 intNDArray<T>::min (int dim) const | |
284 { | |
285 ArrayN<octave_idx_type> dummy_idx; | |
286 return min (dummy_idx, dim); | |
287 } | |
288 | |
289 template <class T> | |
290 intNDArray<T> | |
291 intNDArray<T>::min (ArrayN<octave_idx_type>& idx_arg, int dim) const | |
292 { | |
293 dim_vector dv = this->dims (); | |
294 dim_vector dr = this->dims (); | |
295 | |
296 if (dv.numel () == 0 || dim > dv.length () || dim < 0) | |
297 return intNDArray<T> (); | |
298 | |
299 dr(dim) = 1; | |
300 | |
301 intNDArray<T> result (dr); | |
302 idx_arg.resize (dr); | |
303 | |
304 octave_idx_type x_stride = 1; | |
305 octave_idx_type x_len = dv(dim); | |
306 for (int i = 0; i < dim; i++) | |
307 x_stride *= dv(i); | |
308 | |
309 for (octave_idx_type i = 0; i < dr.numel (); i++) | |
310 { | |
311 octave_idx_type x_offset; | |
312 if (x_stride == 1) | |
313 x_offset = i * x_len; | |
314 else | |
315 { | |
316 octave_idx_type x_offset2 = 0; | |
317 x_offset = i; | |
318 while (x_offset >= x_stride) | |
319 { | |
320 x_offset -= x_stride; | |
321 x_offset2++; | |
322 } | |
323 x_offset += x_offset2 * x_stride * x_len; | |
324 } | |
325 | |
326 octave_idx_type idx_j = 0; | |
327 | |
328 T tmp_min = this->elem (x_offset); | |
329 | |
330 for (octave_idx_type j = 1; j < x_len; j++) | |
331 { | |
332 T tmp = this->elem (j * x_stride + x_offset); | |
333 | |
334 if (tmp < tmp_min) | |
335 { | |
336 idx_j = j; | |
337 tmp_min = tmp; | |
338 } | |
339 } | |
340 | |
341 result.elem (i) = tmp_min; | |
342 idx_arg.elem (i) = idx_j; | |
343 } | |
344 | |
7600
24abf5a702d9
Chop trailing singletons in min/max functions
David Bateman <dbateman@free.fr>
parents:
7503
diff
changeset
|
345 result.chop_trailing_singletons (); |
24abf5a702d9
Chop trailing singletons in min/max functions
David Bateman <dbateman@free.fr>
parents:
7503
diff
changeset
|
346 idx_arg.chop_trailing_singletons (); |
24abf5a702d9
Chop trailing singletons in min/max functions
David Bateman <dbateman@free.fr>
parents:
7503
diff
changeset
|
347 |
7189 | 348 return result; |
349 } | |
350 | |
4902 | 351 /* |
352 ;;; Local Variables: *** | |
353 ;;; mode: C++ *** | |
354 ;;; End: *** | |
355 */ |