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 */