Mercurial > hg > octave-nkf
comparison liboctave/Array-util.cc @ 4588:19bfd295f400
[project @ 2003-11-10 17:18:48 by jwe]
author | jwe |
---|---|
date | Mon, 10 Nov 2003 17:22:02 +0000 |
parents | |
children | 77566be8b9e9 |
comparison
equal
deleted
inserted
replaced
4587:7b957b442818 | 4588:19bfd295f400 |
---|---|
1 /* | |
2 | |
3 Copyright (C) 2003 John W. Eaton | |
4 | |
5 This file is part of Octave. | |
6 | |
7 Octave is free software; you can redistribute it and/or modify it | |
8 under the terms of the GNU General Public License as published by the | |
9 Free Software Foundation; either version 2, or (at your option) any | |
10 later version. | |
11 | |
12 Octave is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 along with Octave; see the file COPYING. If not, write to the Free | |
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
20 | |
21 */ | |
22 | |
23 #ifdef HAVE_CONFIG_H | |
24 #include <config.h> | |
25 #endif | |
26 | |
27 #include "Array-util.h" | |
28 | |
29 bool | |
30 index_in_bounds (const Array<int>& ra_idx, const dim_vector& dimensions) | |
31 { | |
32 bool retval = true; | |
33 | |
34 int n = ra_idx.length (); | |
35 | |
36 if (n == dimensions.length ()) | |
37 { | |
38 for (int i = 0; i < n; i++) | |
39 { | |
40 if (ra_idx(i) < 0 || ra_idx(i) > dimensions (i)) | |
41 { | |
42 retval = false; | |
43 break; | |
44 } | |
45 } | |
46 } | |
47 else | |
48 retval = false; | |
49 | |
50 return retval; | |
51 } | |
52 | |
53 void | |
54 increment_index (Array<int>& ra_idx, const dim_vector& dimensions, | |
55 int start_dimension) | |
56 { | |
57 ra_idx(start_dimension)++; | |
58 | |
59 int n = ra_idx.length () - 1; | |
60 | |
61 for (int i = start_dimension; i < n; i++) | |
62 { | |
63 if (ra_idx(i) < dimensions(i)) | |
64 break; | |
65 else | |
66 { | |
67 ra_idx(i) = 0; | |
68 ra_idx(i+1)++; | |
69 } | |
70 } | |
71 } | |
72 | |
73 int | |
74 get_scalar_idx (Array<int>& idx, dim_vector& dims) | |
75 { | |
76 int retval (-1); | |
77 | |
78 int n = idx.length (); | |
79 | |
80 if (n > 0) | |
81 { | |
82 retval = idx(--n); | |
83 | |
84 while (--n >= 0) | |
85 { | |
86 retval *= dims (n); | |
87 | |
88 retval += idx(n); | |
89 } | |
90 } | |
91 return retval; | |
92 } | |
93 | |
94 int | |
95 num_ones (const Array<int>& ra_idx) | |
96 { | |
97 int retval (0); | |
98 for (int i = 0; i < ra_idx.length (); i++) | |
99 { | |
100 if (ra_idx (i) == 1) | |
101 retval++; | |
102 } | |
103 return retval; | |
104 } | |
105 | |
106 bool | |
107 is_scalar (const dim_vector& dim) | |
108 { | |
109 bool retval = true; | |
110 | |
111 int n = dim.length (); | |
112 | |
113 if (n == 0) | |
114 { | |
115 retval = false; | |
116 } | |
117 else | |
118 { | |
119 for (int i = 0; i < n; i ++) | |
120 { | |
121 if (dim (i) != 1) | |
122 { | |
123 retval = false; | |
124 | |
125 break; | |
126 } | |
127 } | |
128 } | |
129 return retval; | |
130 } | |
131 | |
132 bool | |
133 any_ones (const Array<int>& arr) | |
134 { | |
135 bool retval = false; | |
136 | |
137 for (int i = 0; i < arr.length (); i++) | |
138 { | |
139 if (arr (i) == 1) | |
140 { | |
141 retval = true; | |
142 | |
143 break; | |
144 } | |
145 } | |
146 return retval; | |
147 } | |
148 | |
149 int | |
150 compute_index (const Array<int>& ra_idx, const dim_vector& dims) | |
151 { | |
152 int retval = -1; | |
153 | |
154 int n = dims.length (); | |
155 | |
156 if (n > 0 && n == ra_idx.length ()) | |
157 { | |
158 retval = ra_idx(--n); | |
159 | |
160 while (--n >= 0) | |
161 { | |
162 retval *= dims(n); | |
163 | |
164 retval += ra_idx(n); | |
165 } | |
166 } | |
167 else | |
168 (*current_liboctave_error_handler) | |
169 ("ArrayN<T>::compute_index: invalid ra_idxing operation"); | |
170 | |
171 return retval; | |
172 } | |
173 | |
174 Array<int> | |
175 conv_to_int_array (const Array<idx_vector>& a) | |
176 { | |
177 Array<int> retval (a.length ()); | |
178 | |
179 for (int i = 0; i < a.length (); i++) | |
180 retval (i) = a(i).elem (0); | |
181 | |
182 return retval; | |
183 } | |
184 | |
185 Array<idx_vector> | |
186 conv_to_array (const idx_vector *tmp, const int len) | |
187 { | |
188 Array<idx_vector> retval (len); | |
189 | |
190 for (int i = 0; i < len; i++) | |
191 retval (i) = tmp[i]; | |
192 | |
193 return retval; | |
194 } | |
195 | |
196 dim_vector | |
197 freeze (Array<idx_vector>& ra_idx, const dim_vector& dimensions, int resize_ok) | |
198 { | |
199 dim_vector retval; | |
200 | |
201 int n = ra_idx.length (); | |
202 | |
203 assert (n == dimensions.length ()); | |
204 | |
205 retval.resize (n); | |
206 | |
207 for (int i = 0; i < n; i++) | |
208 retval(i) = ra_idx(i).freeze (dimensions(i), "XXX FIXME XXX", resize_ok); | |
209 | |
210 return retval; | |
211 } | |
212 | |
213 bool | |
214 vector_equivalent (const Array<int>& ra_idx) | |
215 { | |
216 int n = ra_idx.length (); | |
217 | |
218 bool found_first = false; | |
219 | |
220 for (int i = 0; i < n; i++) | |
221 { | |
222 if (ra_idx(i) != 1) | |
223 { | |
224 if (! found_first) | |
225 found_first = true; | |
226 else | |
227 return false; | |
228 } | |
229 } | |
230 | |
231 return true; | |
232 } | |
233 | |
234 bool | |
235 equal_arrays (const dim_vector& a, const dim_vector& b) | |
236 { | |
237 bool retval = true; | |
238 | |
239 if (a.length () != b.length ()) | |
240 retval = false; | |
241 else | |
242 { | |
243 for (int i = 0; i < a.length (); i++) | |
244 { | |
245 if (a(i) != b(i)) | |
246 retval = false; | |
247 } | |
248 } | |
249 | |
250 return retval; | |
251 } | |
252 | |
253 bool | |
254 all_ok (const Array<idx_vector>& ra_idx) | |
255 { | |
256 bool retval = true; | |
257 | |
258 int n = ra_idx.length (); | |
259 | |
260 for (int i = 0; i < n; i++) | |
261 { | |
262 if (! ra_idx(i)) | |
263 { | |
264 retval = false; | |
265 break; | |
266 } | |
267 } | |
268 | |
269 return retval; | |
270 } | |
271 | |
272 bool | |
273 any_orig_empty (const Array<idx_vector>& ra_idx) | |
274 { | |
275 bool retval = false; | |
276 | |
277 int n = ra_idx.length (); | |
278 | |
279 for (int i = 0; i < n; i++) | |
280 { | |
281 if (ra_idx(i).orig_empty ()) | |
282 { | |
283 retval = true; | |
284 break; | |
285 } | |
286 } | |
287 | |
288 return retval; | |
289 } | |
290 | |
291 bool | |
292 any_zero_len (const dim_vector& frozen_lengths) | |
293 { | |
294 bool retval = false; | |
295 | |
296 int n = frozen_lengths.length (); | |
297 | |
298 for (int i = 0; i < n; i++) | |
299 { | |
300 if (frozen_lengths(i) == 0) | |
301 { | |
302 retval = true; | |
303 break; | |
304 } | |
305 } | |
306 | |
307 return retval; | |
308 } | |
309 | |
310 dim_vector | |
311 get_zero_len_size (const dim_vector& frozen_lengths, | |
312 const dim_vector& dimensions) | |
313 { | |
314 dim_vector retval; | |
315 assert (0); | |
316 return retval; | |
317 } | |
318 | |
319 bool | |
320 all_colon_equiv (const Array<idx_vector>& ra_idx, | |
321 const dim_vector& frozen_lengths) | |
322 { | |
323 bool retval = true; | |
324 | |
325 int idx_n = ra_idx.length (); | |
326 | |
327 int n = frozen_lengths.length (); | |
328 | |
329 assert (idx_n == n); | |
330 | |
331 for (int i = 0; i < n; i++) | |
332 { | |
333 if (! ra_idx(i).is_colon_equiv (frozen_lengths(i))) | |
334 { | |
335 retval = false; | |
336 break; | |
337 } | |
338 } | |
339 | |
340 return retval; | |
341 } | |
342 | |
343 bool | |
344 is_in (int num, const idx_vector& idx) | |
345 { | |
346 int n = idx.capacity (); | |
347 | |
348 for (int i = 0; i < n; i++) | |
349 if (idx.elem (i) == num) | |
350 return true; | |
351 | |
352 return false; | |
353 } | |
354 | |
355 int | |
356 how_many_lgt (const int num, idx_vector& idxv) | |
357 { | |
358 int retval = 0; | |
359 | |
360 int n = idxv.capacity (); | |
361 | |
362 for (int i = 0; i < n; i++) | |
363 { | |
364 if (num > idxv.elem (i)) | |
365 retval++; | |
366 } | |
367 | |
368 return retval; | |
369 } | |
370 | |
371 bool | |
372 all_ones (const Array<int>& arr) | |
373 { | |
374 bool retval = true; | |
375 | |
376 for (int i = 0; i < arr.length (); i++) | |
377 { | |
378 if (arr(i) != 1) | |
379 { | |
380 retval = false; | |
381 break; | |
382 } | |
383 } | |
384 | |
385 return retval; | |
386 } | |
387 | |
388 Array<int> | |
389 get_elt_idx (const Array<idx_vector>& ra_idx, const Array<int>& result_idx) | |
390 { | |
391 int n = ra_idx.length (); | |
392 | |
393 Array<int> retval (n); | |
394 | |
395 for (int i = 0; i < n; i++) | |
396 retval(i) = ra_idx(i).elem (result_idx(i)); | |
397 | |
398 return retval; | |
399 } | |
400 | |
401 int | |
402 number_of_elements (const dim_vector ra_idx) | |
403 { | |
404 int retval = 1; | |
405 | |
406 int n = ra_idx.length (); | |
407 | |
408 if (n == 0) | |
409 retval = 0; | |
410 | |
411 for (int i = 0; i < n; i++) | |
412 retval *= ra_idx(i); | |
413 | |
414 return retval; | |
415 } | |
416 | |
417 Array<int> | |
418 get_ra_idx (int idx, const dim_vector& dims) | |
419 { | |
420 Array<int> retval; | |
421 | |
422 int n_dims = dims.length (); | |
423 | |
424 retval.resize (n_dims); | |
425 | |
426 for (int i = 0; i < n_dims; i++) | |
427 retval(i) = 0; | |
428 | |
429 assert (idx > 0 || idx < number_of_elements (dims)); | |
430 | |
431 for (int i = 0; i < idx; i++) | |
432 increment_index (retval, dims); | |
433 | |
434 // XXX FIXME XXX -- the solution using increment_index is not | |
435 // efficient. | |
436 | |
437 #if 0 | |
438 int var = 1; | |
439 for (int i = 0; i < n_dims; i++) | |
440 { | |
441 std::cout << "idx: " << idx << ", var: " << var << ", dims(" << i << "): " << dims(i) <<"\n"; | |
442 retval(i) = ((int)floor(((idx) / (double)var))) % dims(i); | |
443 idx -= var * retval(i); | |
444 var = dims(i); | |
445 } | |
446 #endif | |
447 | |
448 return retval; | |
449 } | |
450 | |
451 dim_vector | |
452 short_freeze (Array<idx_vector>& ra_idx, const dim_vector& dimensions, | |
453 int resize_ok) | |
454 { | |
455 dim_vector retval; | |
456 | |
457 int n = ra_idx.length (); | |
458 | |
459 int n_dims = dimensions.length (); | |
460 | |
461 if (n == n_dims) | |
462 { | |
463 retval = freeze (ra_idx, dimensions, resize_ok); | |
464 } | |
465 else if (n < n_dims) | |
466 { | |
467 retval.resize (n); | |
468 | |
469 for (int i = 0; i < n - 1; i++) | |
470 retval(i) = ra_idx(i).freeze (dimensions(i), "dimension", resize_ok); | |
471 | |
472 int size_left = 1; | |
473 | |
474 for (int i = n - 1; i < n_dims; i++) | |
475 size_left *= dimensions(i); | |
476 | |
477 if (ra_idx(n-1).is_colon()) | |
478 { | |
479 retval(n-1) = size_left; | |
480 } | |
481 else | |
482 { | |
483 int last_ra_idx = ra_idx(n-1)(0); | |
484 | |
485 if (last_ra_idx < dimensions(n - 1)) | |
486 { | |
487 retval(n - 1) = ra_idx(n - 1).freeze (dimensions(n-1), | |
488 "dimension", resize_ok); | |
489 } | |
490 else | |
491 { | |
492 if (size_left <= last_ra_idx) | |
493 { | |
494 // Make it larger than it should be to get an error | |
495 // later. | |
496 | |
497 retval.resize(n_dims + 1); | |
498 | |
499 (*current_liboctave_error_handler) | |
500 ("index exceeds N-d array dimensions"); | |
501 } | |
502 else | |
503 { | |
504 retval(n-1) = 1; | |
505 } | |
506 } | |
507 } | |
508 } | |
509 | |
510 return retval; | |
511 } | |
512 | |
513 /* | |
514 ;;; Local Variables: *** | |
515 ;;; mode: C++ *** | |
516 ;;; End: *** | |
517 */ |