Mercurial > hg > octave-lyh
comparison liboctave/Array-util.cc @ 5275:23b37da9fd5b
[project @ 2005-04-08 16:07:35 by jwe]
author | jwe |
---|---|
date | Fri, 08 Apr 2005 16:07:37 +0000 |
parents | 9eab94f5fadf |
children | 4c8a2e4e0717 |
comparison
equal
deleted
inserted
replaced
5274:eae7b40388e9 | 5275:23b37da9fd5b |
---|---|
27 #include "Array-util.h" | 27 #include "Array-util.h" |
28 #include "dim-vector.h" | 28 #include "dim-vector.h" |
29 #include "lo-error.h" | 29 #include "lo-error.h" |
30 | 30 |
31 bool | 31 bool |
32 index_in_bounds (const Array<int>& ra_idx, const dim_vector& dimensions) | 32 index_in_bounds (const Array<octave_idx_type>& ra_idx, const dim_vector& dimensions) |
33 { | 33 { |
34 bool retval = true; | 34 bool retval = true; |
35 | 35 |
36 int n = ra_idx.length (); | 36 int n = ra_idx.length (); |
37 | 37 |
51 | 51 |
52 return retval; | 52 return retval; |
53 } | 53 } |
54 | 54 |
55 void | 55 void |
56 increment_index (Array<int>& ra_idx, const dim_vector& dimensions, | 56 increment_index (Array<octave_idx_type>& ra_idx, const dim_vector& dimensions, |
57 int start_dimension) | 57 int start_dimension) |
58 { | 58 { |
59 ra_idx(start_dimension)++; | 59 ra_idx(start_dimension)++; |
60 | 60 |
61 int n = ra_idx.length () - 1; | 61 int n = ra_idx.length () - 1; |
70 ra_idx(i+1)++; | 70 ra_idx(i+1)++; |
71 } | 71 } |
72 } | 72 } |
73 } | 73 } |
74 | 74 |
75 int | 75 octave_idx_type |
76 get_scalar_idx (Array<int>& idx, dim_vector& dims) | 76 get_scalar_idx (Array<octave_idx_type>& idx, dim_vector& dims) |
77 { | 77 { |
78 int retval (-1); | 78 octave_idx_type retval (-1); |
79 | 79 |
80 int n = idx.length (); | 80 int n = idx.length (); |
81 | 81 |
82 if (n > 0) | 82 if (n > 0) |
83 { | 83 { |
91 } | 91 } |
92 } | 92 } |
93 return retval; | 93 return retval; |
94 } | 94 } |
95 | 95 |
96 int | 96 octave_idx_type |
97 num_ones (const Array<int>& ra_idx) | 97 num_ones (const Array<octave_idx_type>& ra_idx) |
98 { | 98 { |
99 int retval = 0; | 99 octave_idx_type retval = 0; |
100 | 100 |
101 for (int i = 0; i < ra_idx.length (); i++) | 101 for (octave_idx_type i = 0; i < ra_idx.length (); i++) |
102 { | 102 { |
103 if (ra_idx (i) == 1) | 103 if (ra_idx (i) == 1) |
104 retval++; | 104 retval++; |
105 } | 105 } |
106 | 106 |
132 } | 132 } |
133 return retval; | 133 return retval; |
134 } | 134 } |
135 | 135 |
136 bool | 136 bool |
137 any_ones (const Array<int>& arr) | 137 any_ones (const Array<octave_idx_type>& arr) |
138 { | 138 { |
139 bool retval = false; | 139 bool retval = false; |
140 | 140 |
141 for (int i = 0; i < arr.length (); i++) | 141 for (octave_idx_type i = 0; i < arr.length (); i++) |
142 { | 142 { |
143 if (arr (i) == 1) | 143 if (arr (i) == 1) |
144 { | 144 { |
145 retval = true; | 145 retval = true; |
146 | 146 |
148 } | 148 } |
149 } | 149 } |
150 return retval; | 150 return retval; |
151 } | 151 } |
152 | 152 |
153 int | 153 octave_idx_type |
154 compute_index (const Array<int>& ra_idx, const dim_vector& dims) | 154 compute_index (const Array<octave_idx_type>& ra_idx, const dim_vector& dims) |
155 { | 155 { |
156 int retval = -1; | 156 octave_idx_type retval = -1; |
157 | 157 |
158 int n = dims.length (); | 158 int n = dims.length (); |
159 | 159 |
160 if (n > 0 && n == ra_idx.length ()) | 160 if (n > 0 && n == ra_idx.length ()) |
161 { | 161 { |
173 ("ArrayN<T>::compute_index: invalid ra_idxing operation"); | 173 ("ArrayN<T>::compute_index: invalid ra_idxing operation"); |
174 | 174 |
175 return retval; | 175 return retval; |
176 } | 176 } |
177 | 177 |
178 Array<int> | 178 Array<octave_idx_type> |
179 conv_to_int_array (const Array<idx_vector>& a) | 179 conv_to_int_array (const Array<idx_vector>& a) |
180 { | 180 { |
181 Array<int> retval (a.length ()); | 181 Array<octave_idx_type> retval (a.length ()); |
182 | 182 |
183 for (int i = 0; i < a.length (); i++) | 183 for (octave_idx_type i = 0; i < a.length (); i++) |
184 retval (i) = a(i).elem (0); | 184 retval (i) = a(i).elem (0); |
185 | 185 |
186 return retval; | 186 return retval; |
187 } | 187 } |
188 | 188 |
189 Array<idx_vector> | 189 Array<idx_vector> |
190 conv_to_array (const idx_vector *tmp, const int len) | 190 conv_to_array (const idx_vector *tmp, const octave_idx_type len) |
191 { | 191 { |
192 Array<idx_vector> retval (len); | 192 Array<idx_vector> retval (len); |
193 | 193 |
194 for (int i = 0; i < len; i++) | 194 for (octave_idx_type i = 0; i < len; i++) |
195 retval (i) = tmp[i]; | 195 retval (i) = tmp[i]; |
196 | 196 |
197 return retval; | 197 return retval; |
198 } | 198 } |
199 | 199 |
216 | 216 |
217 return retval; | 217 return retval; |
218 } | 218 } |
219 | 219 |
220 bool | 220 bool |
221 vector_equivalent (const Array<int>& ra_idx) | 221 vector_equivalent (const Array<octave_idx_type>& ra_idx) |
222 { | 222 { |
223 int n = ra_idx.length (); | 223 octave_idx_type n = ra_idx.length (); |
224 | 224 |
225 bool found_first = false; | 225 bool found_first = false; |
226 | 226 |
227 for (int i = 0; i < n; i++) | 227 for (octave_idx_type i = 0; i < n; i++) |
228 { | 228 { |
229 if (ra_idx(i) != 1) | 229 if (ra_idx(i) != 1) |
230 { | 230 { |
231 if (! found_first) | 231 if (! found_first) |
232 found_first = true; | 232 found_first = true; |
241 bool | 241 bool |
242 all_ok (const Array<idx_vector>& ra_idx) | 242 all_ok (const Array<idx_vector>& ra_idx) |
243 { | 243 { |
244 bool retval = true; | 244 bool retval = true; |
245 | 245 |
246 int n = ra_idx.length (); | 246 octave_idx_type n = ra_idx.length (); |
247 | 247 |
248 for (int i = 0; i < n; i++) | 248 for (octave_idx_type i = 0; i < n; i++) |
249 { | 249 { |
250 if (! ra_idx(i)) | 250 if (! ra_idx(i)) |
251 { | 251 { |
252 retval = false; | 252 retval = false; |
253 break; | 253 break; |
260 bool | 260 bool |
261 any_orig_empty (const Array<idx_vector>& ra_idx) | 261 any_orig_empty (const Array<idx_vector>& ra_idx) |
262 { | 262 { |
263 bool retval = false; | 263 bool retval = false; |
264 | 264 |
265 int n = ra_idx.length (); | 265 octave_idx_type n = ra_idx.length (); |
266 | 266 |
267 for (int i = 0; i < n; i++) | 267 for (octave_idx_type i = 0; i < n; i++) |
268 { | 268 { |
269 if (ra_idx(i).orig_empty ()) | 269 if (ra_idx(i).orig_empty ()) |
270 { | 270 { |
271 retval = true; | 271 retval = true; |
272 break; | 272 break; |
280 all_colon_equiv (const Array<idx_vector>& ra_idx, | 280 all_colon_equiv (const Array<idx_vector>& ra_idx, |
281 const dim_vector& frozen_lengths) | 281 const dim_vector& frozen_lengths) |
282 { | 282 { |
283 bool retval = true; | 283 bool retval = true; |
284 | 284 |
285 int idx_n = ra_idx.length (); | 285 octave_idx_type idx_n = ra_idx.length (); |
286 | 286 |
287 int n = frozen_lengths.length (); | 287 int n = frozen_lengths.length (); |
288 | 288 |
289 assert (idx_n == n); | 289 assert (idx_n == n); |
290 | 290 |
291 for (int i = 0; i < n; i++) | 291 for (octave_idx_type i = 0; i < n; i++) |
292 { | 292 { |
293 if (! ra_idx(i).is_colon_equiv (frozen_lengths(i))) | 293 if (! ra_idx(i).is_colon_equiv (frozen_lengths(i))) |
294 { | 294 { |
295 retval = false; | 295 retval = false; |
296 break; | 296 break; |
299 | 299 |
300 return retval; | 300 return retval; |
301 } | 301 } |
302 | 302 |
303 bool | 303 bool |
304 is_in (int num, const idx_vector& idx) | 304 is_in (octave_idx_type num, const idx_vector& idx) |
305 { | 305 { |
306 int n = idx.capacity (); | 306 octave_idx_type n = idx.capacity (); |
307 | 307 |
308 for (int i = 0; i < n; i++) | 308 for (octave_idx_type i = 0; i < n; i++) |
309 if (idx.elem (i) == num) | 309 if (idx.elem (i) == num) |
310 return true; | 310 return true; |
311 | 311 |
312 return false; | 312 return false; |
313 } | 313 } |
314 | 314 |
315 int | 315 octave_idx_type |
316 how_many_lgt (const int num, idx_vector& idxv) | 316 how_many_lgt (const octave_idx_type num, idx_vector& idxv) |
317 { | 317 { |
318 int retval = 0; | 318 octave_idx_type retval = 0; |
319 | 319 |
320 int n = idxv.capacity (); | 320 octave_idx_type n = idxv.capacity (); |
321 | 321 |
322 for (int i = 0; i < n; i++) | 322 for (octave_idx_type i = 0; i < n; i++) |
323 { | 323 { |
324 if (num > idxv.elem (i)) | 324 if (num > idxv.elem (i)) |
325 retval++; | 325 retval++; |
326 } | 326 } |
327 | 327 |
328 return retval; | 328 return retval; |
329 } | 329 } |
330 | 330 |
331 bool | 331 bool |
332 all_ones (const Array<int>& arr) | 332 all_ones (const Array<octave_idx_type>& arr) |
333 { | 333 { |
334 bool retval = true; | 334 bool retval = true; |
335 | 335 |
336 for (int i = 0; i < arr.length (); i++) | 336 for (octave_idx_type i = 0; i < arr.length (); i++) |
337 { | 337 { |
338 if (arr(i) != 1) | 338 if (arr(i) != 1) |
339 { | 339 { |
340 retval = false; | 340 retval = false; |
341 break; | 341 break; |
343 } | 343 } |
344 | 344 |
345 return retval; | 345 return retval; |
346 } | 346 } |
347 | 347 |
348 Array<int> | 348 Array<octave_idx_type> |
349 get_elt_idx (const Array<idx_vector>& ra_idx, const Array<int>& result_idx) | 349 get_elt_idx (const Array<idx_vector>& ra_idx, const Array<octave_idx_type>& result_idx) |
350 { | 350 { |
351 int n = ra_idx.length (); | 351 octave_idx_type n = ra_idx.length (); |
352 | 352 |
353 Array<int> retval (n); | 353 Array<octave_idx_type> retval (n); |
354 | 354 |
355 for (int i = 0; i < n; i++) | 355 for (octave_idx_type i = 0; i < n; i++) |
356 retval(i) = ra_idx(i).elem (result_idx(i)); | 356 retval(i) = ra_idx(i).elem (result_idx(i)); |
357 | 357 |
358 return retval; | 358 return retval; |
359 } | 359 } |
360 | 360 |
361 Array<int> | 361 Array<octave_idx_type> |
362 get_ra_idx (int idx, const dim_vector& dims) | 362 get_ra_idx (octave_idx_type idx, const dim_vector& dims) |
363 { | 363 { |
364 Array<int> retval; | 364 Array<octave_idx_type> retval; |
365 | 365 |
366 int n_dims = dims.length (); | 366 int n_dims = dims.length (); |
367 | 367 |
368 retval.resize (n_dims); | 368 retval.resize (n_dims); |
369 | 369 |
370 for (int i = 0; i < n_dims; i++) | 370 for (int i = 0; i < n_dims; i++) |
371 retval(i) = 0; | 371 retval(i) = 0; |
372 | 372 |
373 assert (idx > 0 || idx < dims.numel ()); | 373 assert (idx > 0 || idx < dims.numel ()); |
374 | 374 |
375 for (int i = 0; i < idx; i++) | 375 for (octave_idx_type i = 0; i < idx; i++) |
376 increment_index (retval, dims); | 376 increment_index (retval, dims); |
377 | 377 |
378 // XXX FIXME XXX -- the solution using increment_index is not | 378 // XXX FIXME XXX -- the solution using increment_index is not |
379 // efficient. | 379 // efficient. |
380 | 380 |
381 #if 0 | 381 #if 0 |
382 int var = 1; | 382 octave_idx_type var = 1; |
383 for (int i = 0; i < n_dims; i++) | 383 for (int i = 0; i < n_dims; i++) |
384 { | 384 { |
385 std::cout << "idx: " << idx << ", var: " << var << ", dims(" << i << "): " << dims(i) <<"\n"; | 385 std::cout << "idx: " << idx << ", var: " << var << ", dims(" << i << "): " << dims(i) <<"\n"; |
386 retval(i) = ((int)floor(((idx) / (double)var))) % dims(i); | 386 retval(i) = ((int)floor(((idx) / (double)var))) % dims(i); |
387 idx -= var * retval(i); | 387 idx -= var * retval(i); |
422 { | 422 { |
423 retval(n-1) = size_left; | 423 retval(n-1) = size_left; |
424 } | 424 } |
425 else | 425 else |
426 { | 426 { |
427 int last_ra_idx = ra_idx(n-1)(0); | 427 octave_idx_type last_ra_idx = ra_idx(n-1)(0); |
428 for (int i = 1; i < ra_idx (n - 1).capacity (); i++) | 428 for (octave_idx_type i = 1; i < ra_idx (n - 1).capacity (); i++) |
429 last_ra_idx = (last_ra_idx > ra_idx(n-1)(i) ? last_ra_idx : | 429 last_ra_idx = (last_ra_idx > ra_idx(n-1)(i) ? last_ra_idx : |
430 ra_idx(n-1)(i)); | 430 ra_idx(n-1)(i)); |
431 | 431 |
432 if (last_ra_idx < size_left) | 432 if (last_ra_idx < size_left) |
433 { | 433 { |
448 } | 448 } |
449 | 449 |
450 return retval; | 450 return retval; |
451 } | 451 } |
452 | 452 |
453 Array<int> | 453 Array<octave_idx_type> |
454 calc_permutated_idx (const Array<int>& old_idx, | 454 calc_permutated_idx (const Array<octave_idx_type>& old_idx, |
455 const Array<int>& perm_vec, bool inv) | 455 const Array<octave_idx_type>& perm_vec, bool inv) |
456 { | 456 { |
457 int n_el = old_idx.length (); | 457 octave_idx_type n_el = old_idx.length (); |
458 | 458 |
459 Array<int> retval (n_el); | 459 Array<octave_idx_type> retval (n_el); |
460 | 460 |
461 for (int i = 0; i < n_el; i++) | 461 for (octave_idx_type i = 0; i < n_el; i++) |
462 { | 462 { |
463 if (inv) | 463 if (inv) |
464 retval(perm_vec(i)) = old_idx(i); | 464 retval(perm_vec(i)) = old_idx(i); |
465 else | 465 else |
466 retval(i) = old_idx(perm_vec(i)); | 466 retval(i) = old_idx(perm_vec(i)); |