Mercurial > hg > octave-nkf
comparison liboctave/Array.cc @ 5275:23b37da9fd5b
[project @ 2005-04-08 16:07:35 by jwe]
author | jwe |
---|---|
date | Fri, 08 Apr 2005 16:07:37 +0000 |
parents | 86185152b7a4 |
children | fe5ee25a5e6c |
comparison
equal
deleted
inserted
replaced
5274:eae7b40388e9 | 5275:23b37da9fd5b |
---|---|
91 new_dimensions = dim_vector (1, 1); | 91 new_dimensions = dim_vector (1, 1); |
92 break; | 92 break; |
93 | 93 |
94 case 1: | 94 case 1: |
95 { | 95 { |
96 int tmp = new_dimensions(0); | 96 octave_idx_type tmp = new_dimensions(0); |
97 | 97 |
98 new_dimensions.resize (2); | 98 new_dimensions.resize (2); |
99 | 99 |
100 new_dimensions(0) = tmp; | 100 new_dimensions(0) = tmp; |
101 new_dimensions(1) = 1; | 101 new_dimensions(1) = 1; |
122 | 122 |
123 // A guess (should be quite conservative). | 123 // A guess (should be quite conservative). |
124 #define MALLOC_OVERHEAD 1024 | 124 #define MALLOC_OVERHEAD 1024 |
125 | 125 |
126 template <class T> | 126 template <class T> |
127 int | 127 octave_idx_type |
128 Array<T>::get_size (int r, int c) | 128 Array<T>::get_size (octave_idx_type r, octave_idx_type c) |
129 { | 129 { |
130 // XXX KLUGE XXX | 130 // XXX KLUGE XXX |
131 | 131 |
132 // If an allocation of an array with r * c elements of type T | 132 // If an allocation of an array with r * c elements of type T |
133 // would cause an overflow in the allocator when computing the | 133 // would cause an overflow in the allocator when computing the |
136 // most current hardware, but not so large to cause the | 136 // most current hardware, but not so large to cause the |
137 // allocator to barf on computing retval * sizeof (T). | 137 // allocator to barf on computing retval * sizeof (T). |
138 | 138 |
139 static int nl; | 139 static int nl; |
140 static double dl | 140 static double dl |
141 = frexp (static_cast<double> | 141 = frexp (static_cast<double> |
142 (INT_MAX - MALLOC_OVERHEAD) / sizeof (T), &nl); | 142 (std::numeric_limits<octave_idx_type>::max() - MALLOC_OVERHEAD) / sizeof (T), &nl); |
143 | 143 |
144 // This value should be an integer. If we return this value and | 144 // This value should be an integer. If we return this value and |
145 // things work the way we expect, we should be paying a visit to | 145 // things work the way we expect, we should be paying a visit to |
146 // new_handler in no time flat. | 146 // new_handler in no time flat. |
147 static int max_items = static_cast<int> (ldexp (dl, nl)); | 147 static octave_idx_type max_items = static_cast<octave_idx_type> (ldexp (dl, nl)); // = dl.2^nl |
148 | 148 |
149 int nr, nc; | 149 int nr, nc; |
150 double dr = frexp (static_cast<double> (r), &nr); | 150 double dr = frexp (static_cast<double> (r), &nr); // r = dr * 2^nr |
151 double dc = frexp (static_cast<double> (c), &nc); | 151 double dc = frexp (static_cast<double> (c), &nc); // c = dc * 2^nc |
152 | 152 |
153 int nt = nr + nc; | 153 int nt = nr + nc; |
154 double dt = dr * dc; | 154 double dt = dr * dc; |
155 | 155 |
156 if (dt < 0.5) | 156 if (dt < 0.5) |
157 { | 157 { |
158 nt--; | 158 nt--; |
159 dt *= 2; | 159 dt *= 2; |
160 } | 160 } |
161 | 161 |
162 // if (r*c) below limit, then return r*c, otherwise return TOO BIG num! | |
162 return (nt < nl || (nt == nl && dt < dl)) ? r * c : max_items; | 163 return (nt < nl || (nt == nl && dt < dl)) ? r * c : max_items; |
163 } | 164 } |
164 | 165 |
165 template <class T> | 166 template <class T> |
166 int | 167 octave_idx_type |
167 Array<T>::get_size (int r, int c, int p) | 168 Array<T>::get_size (octave_idx_type r, octave_idx_type c, octave_idx_type p) |
168 { | 169 { |
169 // XXX KLUGE XXX | 170 // XXX KLUGE XXX |
170 | 171 |
171 // If an allocation of an array with r * c * p elements of type T | 172 // If an allocation of an array with r * c * p elements of type T |
172 // would cause an overflow in the allocator when computing the | 173 // would cause an overflow in the allocator when computing the |
176 // allocator to barf on computing retval * sizeof (T). | 177 // allocator to barf on computing retval * sizeof (T). |
177 | 178 |
178 static int nl; | 179 static int nl; |
179 static double dl | 180 static double dl |
180 = frexp (static_cast<double> | 181 = frexp (static_cast<double> |
181 (INT_MAX - MALLOC_OVERHEAD) / sizeof (T), &nl); | 182 (std::numeric_limits<octave_idx_type>::max() - MALLOC_OVERHEAD) / sizeof (T), &nl); |
182 | 183 |
183 // This value should be an integer. If we return this value and | 184 // This value should be an integer. If we return this value and |
184 // things work the way we expect, we should be paying a visit to | 185 // things work the way we expect, we should be paying a visit to |
185 // new_handler in no time flat. | 186 // new_handler in no time flat. |
186 static int max_items = static_cast<int> (ldexp (dl, nl)); | 187 static octave_idx_type max_items = static_cast<octave_idx_type> (ldexp (dl, nl)); |
187 | 188 |
188 int nr, nc, np; | 189 int nr, nc, np; |
189 double dr = frexp (static_cast<double> (r), &nr); | 190 double dr = frexp (static_cast<double> (r), &nr); |
190 double dc = frexp (static_cast<double> (c), &nc); | 191 double dc = frexp (static_cast<double> (c), &nc); |
191 double dp = frexp (static_cast<double> (p), &np); | 192 double dp = frexp (static_cast<double> (p), &np); |
207 | 208 |
208 return (nt < nl || (nt == nl && dt < dl)) ? r * c * p : max_items; | 209 return (nt < nl || (nt == nl && dt < dl)) ? r * c * p : max_items; |
209 } | 210 } |
210 | 211 |
211 template <class T> | 212 template <class T> |
212 int | 213 octave_idx_type |
213 Array<T>::get_size (const dim_vector& ra_idx) | 214 Array<T>::get_size (const dim_vector& ra_idx) |
214 { | 215 { |
215 // XXX KLUGE XXX | 216 // XXX KLUGE XXX |
216 | 217 |
217 // If an allocation of an array with r * c elements of type T | 218 // If an allocation of an array with r * c elements of type T |
222 // allocator to barf on computing retval * sizeof (T). | 223 // allocator to barf on computing retval * sizeof (T). |
223 | 224 |
224 static int nl; | 225 static int nl; |
225 static double dl | 226 static double dl |
226 = frexp (static_cast<double> | 227 = frexp (static_cast<double> |
227 (INT_MAX - MALLOC_OVERHEAD) / sizeof (T), &nl); | 228 (std::numeric_limits<octave_idx_type>::max() - MALLOC_OVERHEAD) / sizeof (T), &nl); |
228 | 229 |
229 // This value should be an integer. If we return this value and | 230 // This value should be an integer. If we return this value and |
230 // things work the way we expect, we should be paying a visit to | 231 // things work the way we expect, we should be paying a visit to |
231 // new_handler in no time flat. | 232 // new_handler in no time flat. |
232 | 233 |
233 static int max_items = static_cast<int> (ldexp (dl, nl)); | 234 static octave_idx_type max_items = static_cast<octave_idx_type> (ldexp (dl, nl)); |
234 | 235 |
235 int retval = max_items; | 236 octave_idx_type retval = max_items; |
236 | 237 |
237 int n = ra_idx.length (); | 238 int n = ra_idx.length (); |
238 | 239 |
239 int nt = 0; | 240 int nt = 0; |
240 double dt = 1; | 241 double dt = 1; |
266 } | 267 } |
267 | 268 |
268 #undef MALLOC_OVERHEAD | 269 #undef MALLOC_OVERHEAD |
269 | 270 |
270 template <class T> | 271 template <class T> |
271 int | 272 octave_idx_type |
272 Array<T>::compute_index (const Array<int>& ra_idx) const | 273 Array<T>::compute_index (const Array<octave_idx_type>& ra_idx) const |
273 { | 274 { |
274 int retval = -1; | 275 octave_idx_type retval = -1; |
275 | 276 |
276 int n = dimensions.length (); | 277 int n = dimensions.length (); |
277 | 278 |
278 if (n > 0 && n == ra_idx.length ()) | 279 if (n > 0 && n == ra_idx.length ()) |
279 { | 280 { |
292 return retval; | 293 return retval; |
293 } | 294 } |
294 | 295 |
295 template <class T> | 296 template <class T> |
296 T | 297 T |
297 Array<T>::range_error (const char *fcn, int n) const | 298 Array<T>::range_error (const char *fcn, octave_idx_type n) const |
298 { | 299 { |
299 (*current_liboctave_error_handler) ("%s (%d): range error", fcn, n); | 300 (*current_liboctave_error_handler) ("%s (%d): range error", fcn, n); |
300 return T (); | 301 return T (); |
301 } | 302 } |
302 | 303 |
303 template <class T> | 304 template <class T> |
304 T& | 305 T& |
305 Array<T>::range_error (const char *fcn, int n) | 306 Array<T>::range_error (const char *fcn, octave_idx_type n) |
306 { | 307 { |
307 (*current_liboctave_error_handler) ("%s (%d): range error", fcn, n); | 308 (*current_liboctave_error_handler) ("%s (%d): range error", fcn, n); |
308 static T foo; | 309 static T foo; |
309 return foo; | 310 return foo; |
310 } | 311 } |
311 | 312 |
312 template <class T> | 313 template <class T> |
313 T | 314 T |
314 Array<T>::range_error (const char *fcn, int i, int j) const | 315 Array<T>::range_error (const char *fcn, octave_idx_type i, octave_idx_type j) const |
315 { | 316 { |
316 (*current_liboctave_error_handler) | 317 (*current_liboctave_error_handler) |
317 ("%s (%d, %d): range error", fcn, i, j); | 318 ("%s (%d, %d): range error", fcn, i, j); |
318 return T (); | 319 return T (); |
319 } | 320 } |
320 | 321 |
321 template <class T> | 322 template <class T> |
322 T& | 323 T& |
323 Array<T>::range_error (const char *fcn, int i, int j) | 324 Array<T>::range_error (const char *fcn, octave_idx_type i, octave_idx_type j) |
324 { | 325 { |
325 (*current_liboctave_error_handler) | 326 (*current_liboctave_error_handler) |
326 ("%s (%d, %d): range error", fcn, i, j); | 327 ("%s (%d, %d): range error", fcn, i, j); |
327 static T foo; | 328 static T foo; |
328 return foo; | 329 return foo; |
329 } | 330 } |
330 | 331 |
331 template <class T> | 332 template <class T> |
332 T | 333 T |
333 Array<T>::range_error (const char *fcn, int i, int j, int k) const | 334 Array<T>::range_error (const char *fcn, octave_idx_type i, octave_idx_type j, octave_idx_type k) const |
334 { | 335 { |
335 (*current_liboctave_error_handler) | 336 (*current_liboctave_error_handler) |
336 ("%s (%d, %d, %d): range error", fcn, i, j, k); | 337 ("%s (%d, %d, %d): range error", fcn, i, j, k); |
337 return T (); | 338 return T (); |
338 } | 339 } |
339 | 340 |
340 template <class T> | 341 template <class T> |
341 T& | 342 T& |
342 Array<T>::range_error (const char *fcn, int i, int j, int k) | 343 Array<T>::range_error (const char *fcn, octave_idx_type i, octave_idx_type j, octave_idx_type k) |
343 { | 344 { |
344 (*current_liboctave_error_handler) | 345 (*current_liboctave_error_handler) |
345 ("%s (%d, %d, %d): range error", fcn, i, j, k); | 346 ("%s (%d, %d, %d): range error", fcn, i, j, k); |
346 static T foo; | 347 static T foo; |
347 return foo; | 348 return foo; |
353 { | 354 { |
354 OSSTREAM buf; | 355 OSSTREAM buf; |
355 | 356 |
356 buf << fcn << " ("; | 357 buf << fcn << " ("; |
357 | 358 |
358 int n = ra_idx.length (); | 359 octave_idx_type n = ra_idx.length (); |
359 | 360 |
360 if (n > 0) | 361 if (n > 0) |
361 buf << ra_idx(0); | 362 buf << ra_idx(0); |
362 | 363 |
363 for (int i = 1; i < n; i++) | 364 for (octave_idx_type i = 1; i < n; i++) |
364 buf << ", " << ra_idx(i); | 365 buf << ", " << ra_idx(i); |
365 | 366 |
366 buf << "): range error"; | 367 buf << "): range error"; |
367 | 368 |
368 buf << OSSTREAM_ENDS; | 369 buf << OSSTREAM_ENDS; |
380 { | 381 { |
381 OSSTREAM buf; | 382 OSSTREAM buf; |
382 | 383 |
383 buf << fcn << " ("; | 384 buf << fcn << " ("; |
384 | 385 |
385 int n = ra_idx.length (); | 386 octave_idx_type n = ra_idx.length (); |
386 | 387 |
387 if (n > 0) | 388 if (n > 0) |
388 buf << ra_idx(0); | 389 buf << ra_idx(0); |
389 | 390 |
390 for (int i = 1; i < n; i++) | 391 for (octave_idx_type i = 1; i < n; i++) |
391 buf << ", " << ra_idx(i); | 392 buf << ", " << ra_idx(i); |
392 | 393 |
393 buf << "): range error"; | 394 buf << "): range error"; |
394 | 395 |
395 buf << OSSTREAM_ENDS; | 396 buf << OSSTREAM_ENDS; |
421 return retval; | 422 return retval; |
422 } | 423 } |
423 | 424 |
424 template <class T> | 425 template <class T> |
425 Array<T> | 426 Array<T> |
426 Array<T>::permute (const Array<int>& perm_vec, bool inv) const | 427 Array<T>::permute (const Array<octave_idx_type>& perm_vec, bool inv) const |
427 { | 428 { |
428 Array<T> retval; | 429 Array<T> retval; |
429 | 430 |
430 dim_vector dv = dims (); | 431 dim_vector dv = dims (); |
431 dim_vector dv_new; | 432 dim_vector dv_new; |
447 Array<bool> checked (perm_vec_len, false); | 448 Array<bool> checked (perm_vec_len, false); |
448 | 449 |
449 // Find dimension vector of permuted array. | 450 // Find dimension vector of permuted array. |
450 for (int i = 0; i < perm_vec_len; i++) | 451 for (int i = 0; i < perm_vec_len; i++) |
451 { | 452 { |
452 int perm_elt = perm_vec.elem (i); | 453 octave_idx_type perm_elt = perm_vec.elem (i); |
453 | 454 |
454 if (perm_elt >= perm_vec_len || perm_elt < 0) | 455 if (perm_elt >= perm_vec_len || perm_elt < 0) |
455 { | 456 { |
456 (*current_liboctave_error_handler) | 457 (*current_liboctave_error_handler) |
457 ("%s: permutation vector contains an invalid element", | 458 ("%s: permutation vector contains an invalid element", |
475 } | 476 } |
476 | 477 |
477 retval.resize (dv_new); | 478 retval.resize (dv_new); |
478 | 479 |
479 // Index array to the original array. | 480 // Index array to the original array. |
480 Array<int> old_idx (perm_vec_len, 0); | 481 Array<octave_idx_type> old_idx (perm_vec_len, 0); |
481 | 482 |
482 // Number of elements in Array (should be the same for | 483 // Number of elements in Array (should be the same for |
483 // both the permuted array and original array). | 484 // both the permuted array and original array). |
484 int n = retval.length (); | 485 octave_idx_type n = retval.length (); |
485 | 486 |
486 // Permute array. | 487 // Permute array. |
487 for (int i = 0; i < n; i++) | 488 for (octave_idx_type i = 0; i < n; i++) |
488 { | 489 { |
489 // Get the idx of permuted array. | 490 // Get the idx of permuted array. |
490 Array<int> new_idx = calc_permutated_idx (old_idx, perm_vec, inv); | 491 Array<octave_idx_type> new_idx = calc_permutated_idx (old_idx, perm_vec, inv); |
491 | 492 |
492 retval.elem (new_idx) = tmp.elem (old_idx); | 493 retval.elem (new_idx) = tmp.elem (old_idx); |
493 | 494 |
494 increment_index (old_idx, dv); | 495 increment_index (old_idx, dv); |
495 } | 496 } |
497 return retval; | 498 return retval; |
498 } | 499 } |
499 | 500 |
500 template <class T> | 501 template <class T> |
501 void | 502 void |
502 Array<T>::resize_no_fill (int n) | 503 Array<T>::resize_no_fill (octave_idx_type n) |
503 { | 504 { |
504 if (n < 0) | 505 if (n < 0) |
505 { | 506 { |
506 (*current_liboctave_error_handler) | 507 (*current_liboctave_error_handler) |
507 ("can't resize to negative dimension"); | 508 ("can't resize to negative dimension"); |
511 if (n == length ()) | 512 if (n == length ()) |
512 return; | 513 return; |
513 | 514 |
514 typename Array<T>::ArrayRep *old_rep = rep; | 515 typename Array<T>::ArrayRep *old_rep = rep; |
515 const T *old_data = data (); | 516 const T *old_data = data (); |
516 int old_len = length (); | 517 octave_idx_type old_len = length (); |
517 | 518 |
518 rep = new typename Array<T>::ArrayRep (n); | 519 rep = new typename Array<T>::ArrayRep (n); |
519 | 520 |
520 dimensions = dim_vector (n); | 521 dimensions = dim_vector (n); |
521 | 522 |
522 if (n > 0 && old_data && old_len > 0) | 523 if (n > 0 && old_data && old_len > 0) |
523 { | 524 { |
524 int min_len = old_len < n ? old_len : n; | 525 octave_idx_type min_len = old_len < n ? old_len : n; |
525 | 526 |
526 for (int i = 0; i < min_len; i++) | 527 for (octave_idx_type i = 0; i < min_len; i++) |
527 xelem (i) = old_data[i]; | 528 xelem (i) = old_data[i]; |
528 } | 529 } |
529 | 530 |
530 if (--old_rep->count <= 0) | 531 if (--old_rep->count <= 0) |
531 delete old_rep; | 532 delete old_rep; |
533 | 534 |
534 template <class T> | 535 template <class T> |
535 void | 536 void |
536 Array<T>::resize_no_fill (const dim_vector& dv) | 537 Array<T>::resize_no_fill (const dim_vector& dv) |
537 { | 538 { |
538 int n = dv.length (); | 539 octave_idx_type n = dv.length (); |
539 | 540 |
540 for (int i = 0; i < n; i++) | 541 for (octave_idx_type i = 0; i < n; i++) |
541 { | 542 { |
542 if (dv(i) < 0) | 543 if (dv(i) < 0) |
543 { | 544 { |
544 (*current_liboctave_error_handler) | 545 (*current_liboctave_error_handler) |
545 ("can't resize to negative dimension"); | 546 ("can't resize to negative dimension"); |
553 { | 554 { |
554 same_size = false; | 555 same_size = false; |
555 } | 556 } |
556 else | 557 else |
557 { | 558 { |
558 for (int i = 0; i < n; i++) | 559 for (octave_idx_type i = 0; i < n; i++) |
559 { | 560 { |
560 if (dv(i) != dimensions(i)) | 561 if (dv(i) != dimensions(i)) |
561 { | 562 { |
562 same_size = false; | 563 same_size = false; |
563 break; | 564 break; |
569 return; | 570 return; |
570 | 571 |
571 typename Array<T>::ArrayRep *old_rep = rep; | 572 typename Array<T>::ArrayRep *old_rep = rep; |
572 const T *old_data = data (); | 573 const T *old_data = data (); |
573 | 574 |
574 int ts = get_size (dv); | 575 octave_idx_type ts = get_size (dv); |
575 | 576 |
576 rep = new typename Array<T>::ArrayRep (ts); | 577 rep = new typename Array<T>::ArrayRep (ts); |
577 | 578 |
578 dim_vector dv_old = dimensions; | 579 dim_vector dv_old = dimensions; |
579 int dv_old_orig_len = dv_old.length (); | 580 octave_idx_type dv_old_orig_len = dv_old.length (); |
580 dimensions = dv; | 581 dimensions = dv; |
581 int ts_old = get_size (dv_old); | 582 octave_idx_type ts_old = get_size (dv_old); |
582 | 583 |
583 if (ts > 0 && ts_old > 0 && dv_old_orig_len > 0) | 584 if (ts > 0 && ts_old > 0 && dv_old_orig_len > 0) |
584 { | 585 { |
585 Array<int> ra_idx (dimensions.length (), 0); | 586 Array<octave_idx_type> ra_idx (dimensions.length (), 0); |
586 | 587 |
587 if (n > dv_old_orig_len) | 588 if (n > dv_old_orig_len) |
588 { | 589 { |
589 dv_old.resize (n); | 590 dv_old.resize (n); |
590 | 591 |
591 for (int i = dv_old_orig_len; i < n; i++) | 592 for (octave_idx_type i = dv_old_orig_len; i < n; i++) |
592 dv_old.elem (i) = 1; | 593 dv_old.elem (i) = 1; |
593 } | 594 } |
594 | 595 |
595 for (int i = 0; i < ts; i++) | 596 for (octave_idx_type i = 0; i < ts; i++) |
596 { | 597 { |
597 if (index_in_bounds (ra_idx, dv_old)) | 598 if (index_in_bounds (ra_idx, dv_old)) |
598 rep->elem (i) = old_data[get_scalar_idx (ra_idx, dv_old)]; | 599 rep->elem (i) = old_data[get_scalar_idx (ra_idx, dv_old)]; |
599 | 600 |
600 increment_index (ra_idx, dimensions); | 601 increment_index (ra_idx, dimensions); |
605 delete old_rep; | 606 delete old_rep; |
606 } | 607 } |
607 | 608 |
608 template <class T> | 609 template <class T> |
609 void | 610 void |
610 Array<T>::resize_no_fill (int r, int c) | 611 Array<T>::resize_no_fill (octave_idx_type r, octave_idx_type c) |
611 { | 612 { |
612 if (r < 0 || c < 0) | 613 if (r < 0 || c < 0) |
613 { | 614 { |
614 (*current_liboctave_error_handler) | 615 (*current_liboctave_error_handler) |
615 ("can't resize to negative dimension"); | 616 ("can't resize to negative dimension"); |
627 return; | 628 return; |
628 | 629 |
629 typename Array<T>::ArrayRep *old_rep = Array<T>::rep; | 630 typename Array<T>::ArrayRep *old_rep = Array<T>::rep; |
630 const T *old_data = data (); | 631 const T *old_data = data (); |
631 | 632 |
632 int old_d1 = dim1 (); | 633 octave_idx_type old_d1 = dim1 (); |
633 int old_d2 = dim2 (); | 634 octave_idx_type old_d2 = dim2 (); |
634 int old_len = length (); | 635 octave_idx_type old_len = length (); |
635 | 636 |
636 int ts = get_size (r, c); | 637 octave_idx_type ts = get_size (r, c); |
637 | 638 |
638 rep = new typename Array<T>::ArrayRep (ts); | 639 rep = new typename Array<T>::ArrayRep (ts); |
639 | 640 |
640 dimensions = dim_vector (r, c); | 641 dimensions = dim_vector (r, c); |
641 | 642 |
642 if (ts > 0 && old_data && old_len > 0) | 643 if (ts > 0 && old_data && old_len > 0) |
643 { | 644 { |
644 int min_r = old_d1 < r ? old_d1 : r; | 645 octave_idx_type min_r = old_d1 < r ? old_d1 : r; |
645 int min_c = old_d2 < c ? old_d2 : c; | 646 octave_idx_type min_c = old_d2 < c ? old_d2 : c; |
646 | 647 |
647 for (int j = 0; j < min_c; j++) | 648 for (octave_idx_type j = 0; j < min_c; j++) |
648 for (int i = 0; i < min_r; i++) | 649 for (octave_idx_type i = 0; i < min_r; i++) |
649 xelem (i, j) = old_data[old_d1*j+i]; | 650 xelem (i, j) = old_data[old_d1*j+i]; |
650 } | 651 } |
651 | 652 |
652 if (--old_rep->count <= 0) | 653 if (--old_rep->count <= 0) |
653 delete old_rep; | 654 delete old_rep; |
654 } | 655 } |
655 | 656 |
656 template <class T> | 657 template <class T> |
657 void | 658 void |
658 Array<T>::resize_no_fill (int r, int c, int p) | 659 Array<T>::resize_no_fill (octave_idx_type r, octave_idx_type c, octave_idx_type p) |
659 { | 660 { |
660 if (r < 0 || c < 0 || p < 0) | 661 if (r < 0 || c < 0 || p < 0) |
661 { | 662 { |
662 (*current_liboctave_error_handler) | 663 (*current_liboctave_error_handler) |
663 ("can't resize to negative dimension"); | 664 ("can't resize to negative dimension"); |
675 return; | 676 return; |
676 | 677 |
677 typename Array<T>::ArrayRep *old_rep = rep; | 678 typename Array<T>::ArrayRep *old_rep = rep; |
678 const T *old_data = data (); | 679 const T *old_data = data (); |
679 | 680 |
680 int old_d1 = dim1 (); | 681 octave_idx_type old_d1 = dim1 (); |
681 int old_d2 = dim2 (); | 682 octave_idx_type old_d2 = dim2 (); |
682 int old_d3 = dim3 (); | 683 octave_idx_type old_d3 = dim3 (); |
683 int old_len = length (); | 684 octave_idx_type old_len = length (); |
684 | 685 |
685 int ts = get_size (get_size (r, c), p); | 686 octave_idx_type ts = get_size (get_size (r, c), p); |
686 | 687 |
687 rep = new typename Array<T>::ArrayRep (ts); | 688 rep = new typename Array<T>::ArrayRep (ts); |
688 | 689 |
689 dimensions = dim_vector (r, c, p); | 690 dimensions = dim_vector (r, c, p); |
690 | 691 |
691 if (ts > 0 && old_data && old_len > 0) | 692 if (ts > 0 && old_data && old_len > 0) |
692 { | 693 { |
693 int min_r = old_d1 < r ? old_d1 : r; | 694 octave_idx_type min_r = old_d1 < r ? old_d1 : r; |
694 int min_c = old_d2 < c ? old_d2 : c; | 695 octave_idx_type min_c = old_d2 < c ? old_d2 : c; |
695 int min_p = old_d3 < p ? old_d3 : p; | 696 octave_idx_type min_p = old_d3 < p ? old_d3 : p; |
696 | 697 |
697 for (int k = 0; k < min_p; k++) | 698 for (octave_idx_type k = 0; k < min_p; k++) |
698 for (int j = 0; j < min_c; j++) | 699 for (octave_idx_type j = 0; j < min_c; j++) |
699 for (int i = 0; i < min_r; i++) | 700 for (octave_idx_type i = 0; i < min_r; i++) |
700 xelem (i, j, k) = old_data[old_d1*(old_d2*k+j)+i]; | 701 xelem (i, j, k) = old_data[old_d1*(old_d2*k+j)+i]; |
701 } | 702 } |
702 | 703 |
703 if (--old_rep->count <= 0) | 704 if (--old_rep->count <= 0) |
704 delete old_rep; | 705 delete old_rep; |
705 } | 706 } |
706 | 707 |
707 template <class T> | 708 template <class T> |
708 void | 709 void |
709 Array<T>::resize_and_fill (int n, const T& val) | 710 Array<T>::resize_and_fill (octave_idx_type n, const T& val) |
710 { | 711 { |
711 if (n < 0) | 712 if (n < 0) |
712 { | 713 { |
713 (*current_liboctave_error_handler) | 714 (*current_liboctave_error_handler) |
714 ("can't resize to negative dimension"); | 715 ("can't resize to negative dimension"); |
718 if (n == length ()) | 719 if (n == length ()) |
719 return; | 720 return; |
720 | 721 |
721 typename Array<T>::ArrayRep *old_rep = rep; | 722 typename Array<T>::ArrayRep *old_rep = rep; |
722 const T *old_data = data (); | 723 const T *old_data = data (); |
723 int old_len = length (); | 724 octave_idx_type old_len = length (); |
724 | 725 |
725 rep = new typename Array<T>::ArrayRep (n); | 726 rep = new typename Array<T>::ArrayRep (n); |
726 | 727 |
727 dimensions = dim_vector (n); | 728 dimensions = dim_vector (n); |
728 | 729 |
729 if (n > 0) | 730 if (n > 0) |
730 { | 731 { |
731 int min_len = old_len < n ? old_len : n; | 732 octave_idx_type min_len = old_len < n ? old_len : n; |
732 | 733 |
733 if (old_data && old_len > 0) | 734 if (old_data && old_len > 0) |
734 { | 735 { |
735 for (int i = 0; i < min_len; i++) | 736 for (octave_idx_type i = 0; i < min_len; i++) |
736 xelem (i) = old_data[i]; | 737 xelem (i) = old_data[i]; |
737 } | 738 } |
738 | 739 |
739 for (int i = old_len; i < n; i++) | 740 for (octave_idx_type i = old_len; i < n; i++) |
740 xelem (i) = val; | 741 xelem (i) = val; |
741 } | 742 } |
742 | 743 |
743 if (--old_rep->count <= 0) | 744 if (--old_rep->count <= 0) |
744 delete old_rep; | 745 delete old_rep; |
745 } | 746 } |
746 | 747 |
747 template <class T> | 748 template <class T> |
748 void | 749 void |
749 Array<T>::resize_and_fill (int r, int c, const T& val) | 750 Array<T>::resize_and_fill (octave_idx_type r, octave_idx_type c, const T& val) |
750 { | 751 { |
751 if (r < 0 || c < 0) | 752 if (r < 0 || c < 0) |
752 { | 753 { |
753 (*current_liboctave_error_handler) | 754 (*current_liboctave_error_handler) |
754 ("can't resize to negative dimension"); | 755 ("can't resize to negative dimension"); |
764 return; | 765 return; |
765 | 766 |
766 typename Array<T>::ArrayRep *old_rep = Array<T>::rep; | 767 typename Array<T>::ArrayRep *old_rep = Array<T>::rep; |
767 const T *old_data = data (); | 768 const T *old_data = data (); |
768 | 769 |
769 int old_d1 = dim1 (); | 770 octave_idx_type old_d1 = dim1 (); |
770 int old_d2 = dim2 (); | 771 octave_idx_type old_d2 = dim2 (); |
771 int old_len = length (); | 772 octave_idx_type old_len = length (); |
772 | 773 |
773 int ts = get_size (r, c); | 774 octave_idx_type ts = get_size (r, c); |
774 | 775 |
775 rep = new typename Array<T>::ArrayRep (ts); | 776 rep = new typename Array<T>::ArrayRep (ts); |
776 | 777 |
777 dimensions = dim_vector (r, c); | 778 dimensions = dim_vector (r, c); |
778 | 779 |
779 if (ts > 0) | 780 if (ts > 0) |
780 { | 781 { |
781 int min_r = old_d1 < r ? old_d1 : r; | 782 octave_idx_type min_r = old_d1 < r ? old_d1 : r; |
782 int min_c = old_d2 < c ? old_d2 : c; | 783 octave_idx_type min_c = old_d2 < c ? old_d2 : c; |
783 | 784 |
784 if (old_data && old_len > 0) | 785 if (old_data && old_len > 0) |
785 { | 786 { |
786 for (int j = 0; j < min_c; j++) | 787 for (octave_idx_type j = 0; j < min_c; j++) |
787 for (int i = 0; i < min_r; i++) | 788 for (octave_idx_type i = 0; i < min_r; i++) |
788 xelem (i, j) = old_data[old_d1*j+i]; | 789 xelem (i, j) = old_data[old_d1*j+i]; |
789 } | 790 } |
790 | 791 |
791 for (int j = 0; j < min_c; j++) | 792 for (octave_idx_type j = 0; j < min_c; j++) |
792 for (int i = min_r; i < r; i++) | 793 for (octave_idx_type i = min_r; i < r; i++) |
793 xelem (i, j) = val; | 794 xelem (i, j) = val; |
794 | 795 |
795 for (int j = min_c; j < c; j++) | 796 for (octave_idx_type j = min_c; j < c; j++) |
796 for (int i = 0; i < r; i++) | 797 for (octave_idx_type i = 0; i < r; i++) |
797 xelem (i, j) = val; | 798 xelem (i, j) = val; |
798 } | 799 } |
799 | 800 |
800 if (--old_rep->count <= 0) | 801 if (--old_rep->count <= 0) |
801 delete old_rep; | 802 delete old_rep; |
802 } | 803 } |
803 | 804 |
804 template <class T> | 805 template <class T> |
805 void | 806 void |
806 Array<T>::resize_and_fill (int r, int c, int p, const T& val) | 807 Array<T>::resize_and_fill (octave_idx_type r, octave_idx_type c, octave_idx_type p, const T& val) |
807 { | 808 { |
808 if (r < 0 || c < 0 || p < 0) | 809 if (r < 0 || c < 0 || p < 0) |
809 { | 810 { |
810 (*current_liboctave_error_handler) | 811 (*current_liboctave_error_handler) |
811 ("can't resize to negative dimension"); | 812 ("can't resize to negative dimension"); |
821 return; | 822 return; |
822 | 823 |
823 typename Array<T>::ArrayRep *old_rep = rep; | 824 typename Array<T>::ArrayRep *old_rep = rep; |
824 const T *old_data = data (); | 825 const T *old_data = data (); |
825 | 826 |
826 int old_d1 = dim1 (); | 827 octave_idx_type old_d1 = dim1 (); |
827 int old_d2 = dim2 (); | 828 octave_idx_type old_d2 = dim2 (); |
828 int old_d3 = dim3 (); | 829 octave_idx_type old_d3 = dim3 (); |
829 | 830 |
830 int old_len = length (); | 831 octave_idx_type old_len = length (); |
831 | 832 |
832 int ts = get_size (get_size (r, c), p); | 833 octave_idx_type ts = get_size (get_size (r, c), p); |
833 | 834 |
834 rep = new typename Array<T>::ArrayRep (ts); | 835 rep = new typename Array<T>::ArrayRep (ts); |
835 | 836 |
836 dimensions = dim_vector (r, c, p); | 837 dimensions = dim_vector (r, c, p); |
837 | 838 |
838 if (ts > 0) | 839 if (ts > 0) |
839 { | 840 { |
840 int min_r = old_d1 < r ? old_d1 : r; | 841 octave_idx_type min_r = old_d1 < r ? old_d1 : r; |
841 int min_c = old_d2 < c ? old_d2 : c; | 842 octave_idx_type min_c = old_d2 < c ? old_d2 : c; |
842 int min_p = old_d3 < p ? old_d3 : p; | 843 octave_idx_type min_p = old_d3 < p ? old_d3 : p; |
843 | 844 |
844 if (old_data && old_len > 0) | 845 if (old_data && old_len > 0) |
845 for (int k = 0; k < min_p; k++) | 846 for (octave_idx_type k = 0; k < min_p; k++) |
846 for (int j = 0; j < min_c; j++) | 847 for (octave_idx_type j = 0; j < min_c; j++) |
847 for (int i = 0; i < min_r; i++) | 848 for (octave_idx_type i = 0; i < min_r; i++) |
848 xelem (i, j, k) = old_data[old_d1*(old_d2*k+j)+i]; | 849 xelem (i, j, k) = old_data[old_d1*(old_d2*k+j)+i]; |
849 | 850 |
850 // XXX FIXME XXX -- if the copy constructor is expensive, this | 851 // XXX FIXME XXX -- if the copy constructor is expensive, this |
851 // may win. Otherwise, it may make more sense to just copy the | 852 // may win. Otherwise, it may make more sense to just copy the |
852 // value everywhere when making the new ArrayRep. | 853 // value everywhere when making the new ArrayRep. |
853 | 854 |
854 for (int k = 0; k < min_p; k++) | 855 for (octave_idx_type k = 0; k < min_p; k++) |
855 for (int j = min_c; j < c; j++) | 856 for (octave_idx_type j = min_c; j < c; j++) |
856 for (int i = 0; i < min_r; i++) | 857 for (octave_idx_type i = 0; i < min_r; i++) |
857 xelem (i, j, k) = val; | 858 xelem (i, j, k) = val; |
858 | 859 |
859 for (int k = 0; k < min_p; k++) | 860 for (octave_idx_type k = 0; k < min_p; k++) |
860 for (int j = 0; j < c; j++) | 861 for (octave_idx_type j = 0; j < c; j++) |
861 for (int i = min_r; i < r; i++) | 862 for (octave_idx_type i = min_r; i < r; i++) |
862 xelem (i, j, k) = val; | 863 xelem (i, j, k) = val; |
863 | 864 |
864 for (int k = min_p; k < p; k++) | 865 for (octave_idx_type k = min_p; k < p; k++) |
865 for (int j = 0; j < c; j++) | 866 for (octave_idx_type j = 0; j < c; j++) |
866 for (int i = 0; i < r; i++) | 867 for (octave_idx_type i = 0; i < r; i++) |
867 xelem (i, j, k) = val; | 868 xelem (i, j, k) = val; |
868 } | 869 } |
869 | 870 |
870 if (--old_rep->count <= 0) | 871 if (--old_rep->count <= 0) |
871 delete old_rep; | 872 delete old_rep; |
873 | 874 |
874 template <class T> | 875 template <class T> |
875 void | 876 void |
876 Array<T>::resize_and_fill (const dim_vector& dv, const T& val) | 877 Array<T>::resize_and_fill (const dim_vector& dv, const T& val) |
877 { | 878 { |
878 int n = dv.length (); | 879 octave_idx_type n = dv.length (); |
879 | 880 |
880 for (int i = 0; i < n; i++) | 881 for (octave_idx_type i = 0; i < n; i++) |
881 { | 882 { |
882 if (dv(i) < 0) | 883 if (dv(i) < 0) |
883 { | 884 { |
884 (*current_liboctave_error_handler) | 885 (*current_liboctave_error_handler) |
885 ("can't resize to negative dimension"); | 886 ("can't resize to negative dimension"); |
893 { | 894 { |
894 same_size = false; | 895 same_size = false; |
895 } | 896 } |
896 else | 897 else |
897 { | 898 { |
898 for (int i = 0; i < n; i++) | 899 for (octave_idx_type i = 0; i < n; i++) |
899 { | 900 { |
900 if (dv(i) != dimensions(i)) | 901 if (dv(i) != dimensions(i)) |
901 { | 902 { |
902 same_size = false; | 903 same_size = false; |
903 break; | 904 break; |
909 return; | 910 return; |
910 | 911 |
911 typename Array<T>::ArrayRep *old_rep = rep; | 912 typename Array<T>::ArrayRep *old_rep = rep; |
912 const T *old_data = data (); | 913 const T *old_data = data (); |
913 | 914 |
914 int len = get_size (dv); | 915 octave_idx_type len = get_size (dv); |
915 | 916 |
916 rep = new typename Array<T>::ArrayRep (len); | 917 rep = new typename Array<T>::ArrayRep (len); |
917 | 918 |
918 dim_vector dv_old = dimensions; | 919 dim_vector dv_old = dimensions; |
919 int dv_old_orig_len = dv_old.length (); | 920 octave_idx_type dv_old_orig_len = dv_old.length (); |
920 dimensions = dv; | 921 dimensions = dv; |
921 | 922 |
922 if (len > 0 && dv_old_orig_len > 0) | 923 if (len > 0 && dv_old_orig_len > 0) |
923 { | 924 { |
924 Array<int> ra_idx (dimensions.length (), 0); | 925 Array<octave_idx_type> ra_idx (dimensions.length (), 0); |
925 | 926 |
926 if (n > dv_old_orig_len) | 927 if (n > dv_old_orig_len) |
927 { | 928 { |
928 dv_old.resize (n); | 929 dv_old.resize (n); |
929 | 930 |
930 for (int i = dv_old_orig_len; i < n; i++) | 931 for (octave_idx_type i = dv_old_orig_len; i < n; i++) |
931 dv_old.elem (i) = 1; | 932 dv_old.elem (i) = 1; |
932 } | 933 } |
933 | 934 |
934 for (int i = 0; i < len; i++) | 935 for (octave_idx_type i = 0; i < len; i++) |
935 { | 936 { |
936 if (index_in_bounds (ra_idx, dv_old)) | 937 if (index_in_bounds (ra_idx, dv_old)) |
937 rep->elem (i) = old_data[get_scalar_idx (ra_idx, dv_old)]; | 938 rep->elem (i) = old_data[get_scalar_idx (ra_idx, dv_old)]; |
938 else | 939 else |
939 rep->elem (i) = val; | 940 rep->elem (i) = val; |
940 | 941 |
941 increment_index (ra_idx, dimensions); | 942 increment_index (ra_idx, dimensions); |
942 } | 943 } |
943 } | 944 } |
944 else | 945 else |
945 for (int i = 0; i < len; i++) | 946 for (octave_idx_type i = 0; i < len; i++) |
946 rep->elem (i) = val; | 947 rep->elem (i) = val; |
947 | 948 |
948 if (--old_rep->count <= 0) | 949 if (--old_rep->count <= 0) |
949 delete old_rep; | 950 delete old_rep; |
950 } | 951 } |
951 | 952 |
952 template <class T> | 953 template <class T> |
953 Array<T>& | 954 Array<T>& |
954 Array<T>::insert (const Array<T>& a, int r, int c) | 955 Array<T>::insert (const Array<T>& a, octave_idx_type r, octave_idx_type c) |
955 { | 956 { |
956 if (ndims () == 2 && a.ndims () == 2) | 957 if (ndims () == 2 && a.ndims () == 2) |
957 insert2 (a, r, c); | 958 insert2 (a, r, c); |
958 else | 959 else |
959 insertN (a, r, c); | 960 insertN (a, r, c); |
962 } | 963 } |
963 | 964 |
964 | 965 |
965 template <class T> | 966 template <class T> |
966 Array<T>& | 967 Array<T>& |
967 Array<T>::insert2 (const Array<T>& a, int r, int c) | 968 Array<T>::insert2 (const Array<T>& a, octave_idx_type r, octave_idx_type c) |
968 { | 969 { |
969 int a_rows = a.rows (); | 970 octave_idx_type a_rows = a.rows (); |
970 int a_cols = a.cols (); | 971 octave_idx_type a_cols = a.cols (); |
971 | 972 |
972 if (r < 0 || r + a_rows > rows () || c < 0 || c + a_cols > cols ()) | 973 if (r < 0 || r + a_rows > rows () || c < 0 || c + a_cols > cols ()) |
973 { | 974 { |
974 (*current_liboctave_error_handler) ("range error for insert"); | 975 (*current_liboctave_error_handler) ("range error for insert"); |
975 return *this; | 976 return *this; |
976 } | 977 } |
977 | 978 |
978 for (int j = 0; j < a_cols; j++) | 979 for (octave_idx_type j = 0; j < a_cols; j++) |
979 for (int i = 0; i < a_rows; i++) | 980 for (octave_idx_type i = 0; i < a_rows; i++) |
980 elem (r+i, c+j) = a.elem (i, j); | 981 elem (r+i, c+j) = a.elem (i, j); |
981 | 982 |
982 return *this; | 983 return *this; |
983 } | 984 } |
984 | 985 |
985 template <class T> | 986 template <class T> |
986 Array<T>& | 987 Array<T>& |
987 Array<T>::insertN (const Array<T>& a, int r, int c) | 988 Array<T>::insertN (const Array<T>& a, octave_idx_type r, octave_idx_type c) |
988 { | 989 { |
989 dim_vector dv = dims (); | 990 dim_vector dv = dims (); |
990 | 991 |
991 dim_vector a_dv = a.dims (); | 992 dim_vector a_dv = a.dims (); |
992 | 993 |
993 int n = a_dv.length (); | 994 int n = a_dv.length (); |
994 | 995 |
995 if (n == dimensions.length ()) | 996 if (n == dimensions.length ()) |
996 { | 997 { |
997 Array<int> a_ra_idx (a_dv.length (), 0); | 998 Array<octave_idx_type> a_ra_idx (a_dv.length (), 0); |
998 | 999 |
999 a_ra_idx.elem (0) = r; | 1000 a_ra_idx.elem (0) = r; |
1000 a_ra_idx.elem (1) = c; | 1001 a_ra_idx.elem (1) = c; |
1001 | 1002 |
1002 for (int i = 0; i < n; i++) | 1003 for (int i = 0; i < n; i++) |
1007 ("Array<T>::insert: range error for insert"); | 1008 ("Array<T>::insert: range error for insert"); |
1008 return *this; | 1009 return *this; |
1009 } | 1010 } |
1010 } | 1011 } |
1011 | 1012 |
1012 int n_elt = a.numel (); | 1013 octave_idx_type n_elt = a.numel (); |
1013 | 1014 |
1014 const T *a_data = a.data (); | 1015 const T *a_data = a.data (); |
1015 | 1016 |
1016 int iidx = 0; | 1017 octave_idx_type iidx = 0; |
1017 | 1018 |
1018 int a_rows = a_dv(0); | 1019 octave_idx_type a_rows = a_dv(0); |
1019 | 1020 |
1020 int this_rows = dv(0); | 1021 octave_idx_type this_rows = dv(0); |
1021 | 1022 |
1022 int numel_page = a_dv(0) * a_dv(1); | 1023 octave_idx_type numel_page = a_dv(0) * a_dv(1); |
1023 | 1024 |
1024 int count_pages = 0; | 1025 octave_idx_type count_pages = 0; |
1025 | 1026 |
1026 for (int i = 0; i < n_elt; i++) | 1027 for (octave_idx_type i = 0; i < n_elt; i++) |
1027 { | 1028 { |
1028 if (i != 0 && i % a_rows == 0) | 1029 if (i != 0 && i % a_rows == 0) |
1029 iidx += (this_rows - a_rows); | 1030 iidx += (this_rows - a_rows); |
1030 | 1031 |
1031 if (i % numel_page == 0) | 1032 if (i % numel_page == 0) |
1041 return *this; | 1042 return *this; |
1042 } | 1043 } |
1043 | 1044 |
1044 template <class T> | 1045 template <class T> |
1045 Array<T>& | 1046 Array<T>& |
1046 Array<T>::insert (const Array<T>& a, const Array<int>& ra_idx) | 1047 Array<T>::insert (const Array<T>& a, const Array<octave_idx_type>& ra_idx) |
1047 { | 1048 { |
1048 int n = ra_idx.length (); | 1049 octave_idx_type n = ra_idx.length (); |
1049 | 1050 |
1050 if (n == dimensions.length ()) | 1051 if (n == dimensions.length ()) |
1051 { | 1052 { |
1052 dim_vector dva = a.dims (); | 1053 dim_vector dva = a.dims (); |
1053 dim_vector dv = dims (); | 1054 dim_vector dv = dims (); |
1054 int len_a = dva.length (); | 1055 int len_a = dva.length (); |
1055 int non_full_dim = 0; | 1056 int non_full_dim = 0; |
1056 | 1057 |
1057 for (int i = 0; i < n; i++) | 1058 for (octave_idx_type i = 0; i < n; i++) |
1058 { | 1059 { |
1059 if (ra_idx(i) < 0 || (ra_idx(i) + | 1060 if (ra_idx(i) < 0 || (ra_idx(i) + |
1060 (i < len_a ? dva(i) : 1)) > dimensions(i)) | 1061 (i < len_a ? dva(i) : 1)) > dimensions(i)) |
1061 { | 1062 { |
1062 (*current_liboctave_error_handler) | 1063 (*current_liboctave_error_handler) |
1072 { | 1073 { |
1073 if (non_full_dim < 2) | 1074 if (non_full_dim < 2) |
1074 { | 1075 { |
1075 // Special case for fast concatenation | 1076 // Special case for fast concatenation |
1076 const T *a_data = a.data (); | 1077 const T *a_data = a.data (); |
1077 int numel_to_move = 1; | 1078 octave_idx_type numel_to_move = 1; |
1078 int skip = 0; | 1079 octave_idx_type skip = 0; |
1079 for (int i = 0; i < len_a; i++) | 1080 for (int i = 0; i < len_a; i++) |
1080 if (ra_idx(i) == 0 && dva(i) == dv(i)) | 1081 if (ra_idx(i) == 0 && dva(i) == dv(i)) |
1081 numel_to_move *= dva(i); | 1082 numel_to_move *= dva(i); |
1082 else | 1083 else |
1083 { | 1084 { |
1084 skip = numel_to_move * (dv(i) - dva(i)); | 1085 skip = numel_to_move * (dv(i) - dva(i)); |
1085 numel_to_move *= dva(i); | 1086 numel_to_move *= dva(i); |
1086 break; | 1087 break; |
1087 } | 1088 } |
1088 | 1089 |
1089 int jidx = ra_idx(n-1); | 1090 octave_idx_type jidx = ra_idx(n-1); |
1090 for (int i = n-2; i >= 0; i--) | 1091 for (int i = n-2; i >= 0; i--) |
1091 { | 1092 { |
1092 jidx *= dv(i); | 1093 jidx *= dv(i); |
1093 jidx += ra_idx(i); | 1094 jidx += ra_idx(i); |
1094 } | 1095 } |
1095 | 1096 |
1096 int iidx = 0; | 1097 octave_idx_type iidx = 0; |
1097 int moves = dva.numel () / numel_to_move; | 1098 octave_idx_type moves = dva.numel () / numel_to_move; |
1098 for (int i = 0; i < moves; i++) | 1099 for (octave_idx_type i = 0; i < moves; i++) |
1099 { | 1100 { |
1100 for (int j = 0; j < numel_to_move; j++) | 1101 for (octave_idx_type j = 0; j < numel_to_move; j++) |
1101 elem (jidx++) = a_data[iidx++]; | 1102 elem (jidx++) = a_data[iidx++]; |
1102 jidx += skip; | 1103 jidx += skip; |
1103 } | 1104 } |
1104 } | 1105 } |
1105 else | 1106 else |
1106 { | 1107 { |
1107 // Generic code | 1108 // Generic code |
1108 const T *a_data = a.data (); | 1109 const T *a_data = a.data (); |
1109 int nel = a.numel (); | 1110 int nel = a.numel (); |
1110 Array<int> a_idx (n, 0); | 1111 Array<octave_idx_type> a_idx (n, 0); |
1111 | 1112 |
1112 for (int i = 0; i < nel; i++) | 1113 for (int i = 0; i < nel; i++) |
1113 { | 1114 { |
1114 int iidx = a_idx(n-1) + ra_idx(n-1); | 1115 int iidx = a_idx(n-1) + ra_idx(n-1); |
1115 for (int j = n-2; j >= 0; j--) | 1116 for (int j = n-2; j >= 0; j--) |
1136 Array<T> | 1137 Array<T> |
1137 Array<T>::transpose (void) const | 1138 Array<T>::transpose (void) const |
1138 { | 1139 { |
1139 assert (ndims () == 2); | 1140 assert (ndims () == 2); |
1140 | 1141 |
1141 int nr = dim1 (); | 1142 octave_idx_type nr = dim1 (); |
1142 int nc = dim2 (); | 1143 octave_idx_type nc = dim2 (); |
1143 | 1144 |
1144 if (nr > 1 && nc > 1) | 1145 if (nr > 1 && nc > 1) |
1145 { | 1146 { |
1146 Array<T> result (dim_vector (nc, nr)); | 1147 Array<T> result (dim_vector (nc, nr)); |
1147 | 1148 |
1148 for (int j = 0; j < nc; j++) | 1149 for (octave_idx_type j = 0; j < nc; j++) |
1149 for (int i = 0; i < nr; i++) | 1150 for (octave_idx_type i = 0; i < nr; i++) |
1150 result.xelem (j, i) = xelem (i, j); | 1151 result.xelem (j, i) = xelem (i, j); |
1151 | 1152 |
1152 return result; | 1153 return result; |
1153 } | 1154 } |
1154 else | 1155 else |
1259 | 1260 |
1260 template <class T> | 1261 template <class T> |
1261 void | 1262 void |
1262 Array<T>::maybe_delete_elements_1 (idx_vector& idx_arg) | 1263 Array<T>::maybe_delete_elements_1 (idx_vector& idx_arg) |
1263 { | 1264 { |
1264 int len = length (); | 1265 octave_idx_type len = length (); |
1265 | 1266 |
1266 if (len == 0) | 1267 if (len == 0) |
1267 return; | 1268 return; |
1268 | 1269 |
1269 if (idx_arg.is_colon_equiv (len, 1)) | 1270 if (idx_arg.is_colon_equiv (len, 1)) |
1272 { | 1273 { |
1273 int num_to_delete = idx_arg.length (len); | 1274 int num_to_delete = idx_arg.length (len); |
1274 | 1275 |
1275 if (num_to_delete != 0) | 1276 if (num_to_delete != 0) |
1276 { | 1277 { |
1277 int new_len = len; | 1278 octave_idx_type new_len = len; |
1278 | 1279 |
1279 int iidx = 0; | 1280 octave_idx_type iidx = 0; |
1280 | 1281 |
1281 for (int i = 0; i < len; i++) | 1282 for (octave_idx_type i = 0; i < len; i++) |
1282 if (i == idx_arg.elem (iidx)) | 1283 if (i == idx_arg.elem (iidx)) |
1283 { | 1284 { |
1284 iidx++; | 1285 iidx++; |
1285 new_len--; | 1286 new_len--; |
1286 | 1287 |
1290 | 1291 |
1291 if (new_len > 0) | 1292 if (new_len > 0) |
1292 { | 1293 { |
1293 T *new_data = new T [new_len]; | 1294 T *new_data = new T [new_len]; |
1294 | 1295 |
1295 int ii = 0; | 1296 octave_idx_type ii = 0; |
1296 iidx = 0; | 1297 iidx = 0; |
1297 for (int i = 0; i < len; i++) | 1298 for (octave_idx_type i = 0; i < len; i++) |
1298 { | 1299 { |
1299 if (iidx < num_to_delete && i == idx_arg.elem (iidx)) | 1300 if (iidx < num_to_delete && i == idx_arg.elem (iidx)) |
1300 iidx++; | 1301 iidx++; |
1301 else | 1302 else |
1302 { | 1303 { |
1324 void | 1325 void |
1325 Array<T>::maybe_delete_elements_2 (idx_vector& idx_arg) | 1326 Array<T>::maybe_delete_elements_2 (idx_vector& idx_arg) |
1326 { | 1327 { |
1327 assert (ndims () == 2); | 1328 assert (ndims () == 2); |
1328 | 1329 |
1329 int nr = dim1 (); | 1330 octave_idx_type nr = dim1 (); |
1330 int nc = dim2 (); | 1331 octave_idx_type nc = dim2 (); |
1331 | 1332 |
1332 if (nr == 0 && nc == 0) | 1333 if (nr == 0 && nc == 0) |
1333 return; | 1334 return; |
1334 | 1335 |
1335 int n; | 1336 octave_idx_type n; |
1336 if (nr == 1) | 1337 if (nr == 1) |
1337 n = nc; | 1338 n = nc; |
1338 else if (nc == 1) | 1339 else if (nc == 1) |
1339 n = nr; | 1340 n = nr; |
1340 else | 1341 else |
1357 return; | 1358 return; |
1358 } | 1359 } |
1359 | 1360 |
1360 idx_arg.sort (true); | 1361 idx_arg.sort (true); |
1361 | 1362 |
1362 int num_to_delete = idx_arg.length (n); | 1363 octave_idx_type num_to_delete = idx_arg.length (n); |
1363 | 1364 |
1364 if (num_to_delete != 0) | 1365 if (num_to_delete != 0) |
1365 { | 1366 { |
1366 int new_n = n; | 1367 octave_idx_type new_n = n; |
1367 | 1368 |
1368 int iidx = 0; | 1369 octave_idx_type iidx = 0; |
1369 | 1370 |
1370 for (int i = 0; i < n; i++) | 1371 for (octave_idx_type i = 0; i < n; i++) |
1371 if (i == idx_arg.elem (iidx)) | 1372 if (i == idx_arg.elem (iidx)) |
1372 { | 1373 { |
1373 iidx++; | 1374 iidx++; |
1374 new_n--; | 1375 new_n--; |
1375 | 1376 |
1379 | 1380 |
1380 if (new_n > 0) | 1381 if (new_n > 0) |
1381 { | 1382 { |
1382 T *new_data = new T [new_n]; | 1383 T *new_data = new T [new_n]; |
1383 | 1384 |
1384 int ii = 0; | 1385 octave_idx_type ii = 0; |
1385 iidx = 0; | 1386 iidx = 0; |
1386 for (int i = 0; i < n; i++) | 1387 for (octave_idx_type i = 0; i < n; i++) |
1387 { | 1388 { |
1388 if (iidx < num_to_delete && i == idx_arg.elem (iidx)) | 1389 if (iidx < num_to_delete && i == idx_arg.elem (iidx)) |
1389 iidx++; | 1390 iidx++; |
1390 else | 1391 else |
1391 { | 1392 { |
1423 void | 1424 void |
1424 Array<T>::maybe_delete_elements (idx_vector& idx_i, idx_vector& idx_j) | 1425 Array<T>::maybe_delete_elements (idx_vector& idx_i, idx_vector& idx_j) |
1425 { | 1426 { |
1426 assert (ndims () == 2); | 1427 assert (ndims () == 2); |
1427 | 1428 |
1428 int nr = dim1 (); | 1429 octave_idx_type nr = dim1 (); |
1429 int nc = dim2 (); | 1430 octave_idx_type nc = dim2 (); |
1430 | 1431 |
1431 if (nr == 0 && nc == 0) | 1432 if (nr == 0 && nc == 0) |
1432 return; | 1433 return; |
1433 | 1434 |
1434 if (idx_i.is_colon ()) | 1435 if (idx_i.is_colon ()) |
1469 resize_no_fill (0, 0); | 1470 resize_no_fill (0, 0); |
1470 else | 1471 else |
1471 { | 1472 { |
1472 idx_j.sort (true); | 1473 idx_j.sort (true); |
1473 | 1474 |
1474 int num_to_delete = idx_j.length (nc); | 1475 octave_idx_type num_to_delete = idx_j.length (nc); |
1475 | 1476 |
1476 if (num_to_delete != 0) | 1477 if (num_to_delete != 0) |
1477 { | 1478 { |
1478 if (nr == 1 && num_to_delete == nc) | 1479 if (nr == 1 && num_to_delete == nc) |
1479 resize_no_fill (0, 0); | 1480 resize_no_fill (0, 0); |
1480 else | 1481 else |
1481 { | 1482 { |
1482 int new_nc = nc; | 1483 octave_idx_type new_nc = nc; |
1483 | 1484 |
1484 int iidx = 0; | 1485 octave_idx_type iidx = 0; |
1485 | 1486 |
1486 for (int j = 0; j < nc; j++) | 1487 for (octave_idx_type j = 0; j < nc; j++) |
1487 if (j == idx_j.elem (iidx)) | 1488 if (j == idx_j.elem (iidx)) |
1488 { | 1489 { |
1489 iidx++; | 1490 iidx++; |
1490 new_nc--; | 1491 new_nc--; |
1491 | 1492 |
1495 | 1496 |
1496 if (new_nc > 0) | 1497 if (new_nc > 0) |
1497 { | 1498 { |
1498 T *new_data = new T [nr * new_nc]; | 1499 T *new_data = new T [nr * new_nc]; |
1499 | 1500 |
1500 int jj = 0; | 1501 octave_idx_type jj = 0; |
1501 iidx = 0; | 1502 iidx = 0; |
1502 for (int j = 0; j < nc; j++) | 1503 for (octave_idx_type j = 0; j < nc; j++) |
1503 { | 1504 { |
1504 if (iidx < num_to_delete && j == idx_j.elem (iidx)) | 1505 if (iidx < num_to_delete && j == idx_j.elem (iidx)) |
1505 iidx++; | 1506 iidx++; |
1506 else | 1507 else |
1507 { | 1508 { |
1508 for (int i = 0; i < nr; i++) | 1509 for (octave_idx_type i = 0; i < nr; i++) |
1509 new_data[nr*jj+i] = elem (i, j); | 1510 new_data[nr*jj+i] = elem (i, j); |
1510 jj++; | 1511 jj++; |
1511 } | 1512 } |
1512 } | 1513 } |
1513 | 1514 |
1532 resize_no_fill (0, 0); | 1533 resize_no_fill (0, 0); |
1533 else | 1534 else |
1534 { | 1535 { |
1535 idx_i.sort (true); | 1536 idx_i.sort (true); |
1536 | 1537 |
1537 int num_to_delete = idx_i.length (nr); | 1538 octave_idx_type num_to_delete = idx_i.length (nr); |
1538 | 1539 |
1539 if (num_to_delete != 0) | 1540 if (num_to_delete != 0) |
1540 { | 1541 { |
1541 if (nc == 1 && num_to_delete == nr) | 1542 if (nc == 1 && num_to_delete == nr) |
1542 resize_no_fill (0, 0); | 1543 resize_no_fill (0, 0); |
1543 else | 1544 else |
1544 { | 1545 { |
1545 int new_nr = nr; | 1546 octave_idx_type new_nr = nr; |
1546 | 1547 |
1547 int iidx = 0; | 1548 octave_idx_type iidx = 0; |
1548 | 1549 |
1549 for (int i = 0; i < nr; i++) | 1550 for (octave_idx_type i = 0; i < nr; i++) |
1550 if (i == idx_i.elem (iidx)) | 1551 if (i == idx_i.elem (iidx)) |
1551 { | 1552 { |
1552 iidx++; | 1553 iidx++; |
1553 new_nr--; | 1554 new_nr--; |
1554 | 1555 |
1558 | 1559 |
1559 if (new_nr > 0) | 1560 if (new_nr > 0) |
1560 { | 1561 { |
1561 T *new_data = new T [new_nr * nc]; | 1562 T *new_data = new T [new_nr * nc]; |
1562 | 1563 |
1563 int ii = 0; | 1564 octave_idx_type ii = 0; |
1564 iidx = 0; | 1565 iidx = 0; |
1565 for (int i = 0; i < nr; i++) | 1566 for (octave_idx_type i = 0; i < nr; i++) |
1566 { | 1567 { |
1567 if (iidx < num_to_delete && i == idx_i.elem (iidx)) | 1568 if (iidx < num_to_delete && i == idx_i.elem (iidx)) |
1568 iidx++; | 1569 iidx++; |
1569 else | 1570 else |
1570 { | 1571 { |
1571 for (int j = 0; j < nc; j++) | 1572 for (octave_idx_type j = 0; j < nc; j++) |
1572 new_data[new_nr*j+ii] = elem (i, j); | 1573 new_data[new_nr*j+ii] = elem (i, j); |
1573 ii++; | 1574 ii++; |
1574 } | 1575 } |
1575 } | 1576 } |
1576 | 1577 |
1600 | 1601 |
1601 template <class T> | 1602 template <class T> |
1602 void | 1603 void |
1603 Array<T>::maybe_delete_elements (Array<idx_vector>& ra_idx, const T& rfv) | 1604 Array<T>::maybe_delete_elements (Array<idx_vector>& ra_idx, const T& rfv) |
1604 { | 1605 { |
1605 int n_idx = ra_idx.length (); | 1606 octave_idx_type n_idx = ra_idx.length (); |
1606 | 1607 |
1607 dim_vector lhs_dims = dims (); | 1608 dim_vector lhs_dims = dims (); |
1608 | 1609 |
1609 if (lhs_dims.all_zero ()) | 1610 if (lhs_dims.all_zero ()) |
1610 return; | 1611 return; |
1615 | 1616 |
1616 Array<int> idx_is_colon_equiv (n_idx, 0); | 1617 Array<int> idx_is_colon_equiv (n_idx, 0); |
1617 | 1618 |
1618 // Initialization of colon arrays. | 1619 // Initialization of colon arrays. |
1619 | 1620 |
1620 for (int i = 0; i < n_idx; i++) | 1621 for (octave_idx_type i = 0; i < n_idx; i++) |
1621 { | 1622 { |
1622 idx_is_colon_equiv(i) = ra_idx(i).is_colon_equiv (lhs_dims(i), 1); | 1623 idx_is_colon_equiv(i) = ra_idx(i).is_colon_equiv (lhs_dims(i), 1); |
1623 | 1624 |
1624 idx_is_colon(i) = ra_idx(i).is_colon (); | 1625 idx_is_colon(i) = ra_idx(i).is_colon (); |
1625 } | 1626 } |
1626 | 1627 |
1627 bool idx_ok = true; | 1628 bool idx_ok = true; |
1628 | 1629 |
1629 // Check for index out of bounds. | 1630 // Check for index out of bounds. |
1630 | 1631 |
1631 for (int i = 0 ; i < n_idx - 1; i++) | 1632 for (octave_idx_type i = 0 ; i < n_idx - 1; i++) |
1632 { | 1633 { |
1633 if (! (idx_is_colon(i) || idx_is_colon_equiv(i))) | 1634 if (! (idx_is_colon(i) || idx_is_colon_equiv(i))) |
1634 { | 1635 { |
1635 ra_idx(i).sort (true); | 1636 ra_idx(i).sort (true); |
1636 | 1637 |
1653 } | 1654 } |
1654 } | 1655 } |
1655 | 1656 |
1656 if (n_idx <= n_lhs_dims) | 1657 if (n_idx <= n_lhs_dims) |
1657 { | 1658 { |
1658 int last_idx = ra_idx(n_idx-1).max (); | 1659 octave_idx_type last_idx = ra_idx(n_idx-1).max (); |
1659 | 1660 |
1660 int sum_el = lhs_dims(n_idx-1); | 1661 octave_idx_type sum_el = lhs_dims(n_idx-1); |
1661 | 1662 |
1662 for (int i = n_idx; i < n_lhs_dims; i++) | 1663 for (octave_idx_type i = n_idx; i < n_lhs_dims; i++) |
1663 sum_el *= lhs_dims(i); | 1664 sum_el *= lhs_dims(i); |
1664 | 1665 |
1665 if (last_idx > sum_el - 1) | 1666 if (last_idx > sum_el - 1) |
1666 { | 1667 { |
1667 (*current_liboctave_error_handler) | 1668 (*current_liboctave_error_handler) |
1700 // in the other dimensions that we started with. | 1701 // in the other dimensions that we started with. |
1701 | 1702 |
1702 dim_vector temp_dims; | 1703 dim_vector temp_dims; |
1703 temp_dims.resize (n_idx); | 1704 temp_dims.resize (n_idx); |
1704 | 1705 |
1705 for (int i = 0; i < n_idx; i++) | 1706 for (octave_idx_type i = 0; i < n_idx; i++) |
1706 { | 1707 { |
1707 if (idx_is_colon (i)) | 1708 if (idx_is_colon (i)) |
1708 temp_dims(i) = lhs_dims(i); | 1709 temp_dims(i) = lhs_dims(i); |
1709 else | 1710 else |
1710 temp_dims(i) = 0; | 1711 temp_dims(i) = 0; |
1723 | 1724 |
1724 if (liboctave_wfi_flag && ! (ra_idx(n_idx-1).is_colon ())) | 1725 if (liboctave_wfi_flag && ! (ra_idx(n_idx-1).is_colon ())) |
1725 (*current_liboctave_warning_handler) | 1726 (*current_liboctave_warning_handler) |
1726 ("fewer indices than dimensions for N-d array"); | 1727 ("fewer indices than dimensions for N-d array"); |
1727 | 1728 |
1728 for (int i = n_idx; i < n_lhs_dims; i++) | 1729 for (octave_idx_type i = n_idx; i < n_lhs_dims; i++) |
1729 lhs_dims(n_idx-1) *= lhs_dims(i); | 1730 lhs_dims(n_idx-1) *= lhs_dims(i); |
1730 | 1731 |
1731 lhs_dims.resize (n_idx); | 1732 lhs_dims.resize (n_idx); |
1732 | 1733 |
1733 // Reshape *this. | 1734 // Reshape *this. |
1736 | 1737 |
1737 int non_col = 0; | 1738 int non_col = 0; |
1738 | 1739 |
1739 // Find the non-colon column. | 1740 // Find the non-colon column. |
1740 | 1741 |
1741 for (int i = 0; i < n_idx; i++) | 1742 for (octave_idx_type i = 0; i < n_idx; i++) |
1742 { | 1743 { |
1743 if (! idx_is_colon(i)) | 1744 if (! idx_is_colon(i)) |
1744 non_col = i; | 1745 non_col = i; |
1745 } | 1746 } |
1746 | 1747 |
1747 // The length of the non-colon dimension. | 1748 // The length of the non-colon dimension. |
1748 | 1749 |
1749 int non_col_dim = lhs_dims (non_col); | 1750 octave_idx_type non_col_dim = lhs_dims (non_col); |
1750 | 1751 |
1751 int num_to_delete = ra_idx(non_col).length (lhs_dims (non_col)); | 1752 octave_idx_type num_to_delete = ra_idx(non_col).length (lhs_dims (non_col)); |
1752 | 1753 |
1753 if (num_to_delete > 0) | 1754 if (num_to_delete > 0) |
1754 { | 1755 { |
1755 int temp = lhs_dims.num_ones (); | 1756 int temp = lhs_dims.num_ones (); |
1756 | 1757 |
1769 else | 1770 else |
1770 { | 1771 { |
1771 // New length of non-colon dimension | 1772 // New length of non-colon dimension |
1772 // (calculated in the next for loop) | 1773 // (calculated in the next for loop) |
1773 | 1774 |
1774 int new_dim = non_col_dim; | 1775 octave_idx_type new_dim = non_col_dim; |
1775 | 1776 |
1776 int iidx = 0; | 1777 octave_idx_type iidx = 0; |
1777 | 1778 |
1778 for (int j = 0; j < non_col_dim; j++) | 1779 for (octave_idx_type j = 0; j < non_col_dim; j++) |
1779 if (j == ra_idx(non_col).elem (iidx)) | 1780 if (j == ra_idx(non_col).elem (iidx)) |
1780 { | 1781 { |
1781 iidx++; | 1782 iidx++; |
1782 | 1783 |
1783 new_dim--; | 1784 new_dim--; |
1790 | 1791 |
1791 if (new_dim > 0) | 1792 if (new_dim > 0) |
1792 { | 1793 { |
1793 // Calculate number of elements in new array. | 1794 // Calculate number of elements in new array. |
1794 | 1795 |
1795 int num_new_elem=1; | 1796 octave_idx_type num_new_elem=1; |
1796 | 1797 |
1797 for (int i = 0; i < n_idx; i++) | 1798 for (int i = 0; i < n_idx; i++) |
1798 { | 1799 { |
1799 if (i == non_col) | 1800 if (i == non_col) |
1800 num_new_elem *= new_dim; | 1801 num_new_elem *= new_dim; |
1803 num_new_elem *= lhs_dims(i); | 1804 num_new_elem *= lhs_dims(i); |
1804 } | 1805 } |
1805 | 1806 |
1806 T *new_data = new T [num_new_elem]; | 1807 T *new_data = new T [num_new_elem]; |
1807 | 1808 |
1808 Array<int> result_idx (n_lhs_dims, 0); | 1809 Array<octave_idx_type> result_idx (n_lhs_dims, 0); |
1809 | 1810 |
1810 dim_vector new_lhs_dim = lhs_dims; | 1811 dim_vector new_lhs_dim = lhs_dims; |
1811 | 1812 |
1812 new_lhs_dim(non_col) = new_dim; | 1813 new_lhs_dim(non_col) = new_dim; |
1813 | 1814 |
1814 int num_elem = 1; | 1815 octave_idx_type num_elem = 1; |
1815 | 1816 |
1816 int numidx = 0; | 1817 octave_idx_type numidx = 0; |
1817 | 1818 |
1818 int n = length (); | 1819 octave_idx_type n = length (); |
1819 | 1820 |
1820 for (int i = 0; i < n_lhs_dims; i++) | 1821 for (int i = 0; i < n_lhs_dims; i++) |
1821 if (i != non_col) | 1822 if (i != non_col) |
1822 num_elem *= lhs_dims(i); | 1823 num_elem *= lhs_dims(i); |
1823 | 1824 |
1824 num_elem *= ra_idx(non_col).capacity (); | 1825 num_elem *= ra_idx(non_col).capacity (); |
1825 | 1826 |
1826 for (int i = 0; i < n; i++) | 1827 for (octave_idx_type i = 0; i < n; i++) |
1827 { | 1828 { |
1828 if (numidx < num_elem | 1829 if (numidx < num_elem |
1829 && is_in (result_idx(non_col), ra_idx(non_col))) | 1830 && is_in (result_idx(non_col), ra_idx(non_col))) |
1830 numidx++; | 1831 numidx++; |
1831 | 1832 |
1832 else | 1833 else |
1833 { | 1834 { |
1834 Array<int> temp_result_idx = result_idx; | 1835 Array<octave_idx_type> temp_result_idx = result_idx; |
1835 | 1836 |
1836 int num_lgt = how_many_lgt (result_idx(non_col), | 1837 octave_idx_type num_lgt = how_many_lgt (result_idx(non_col), |
1837 ra_idx(non_col)); | 1838 ra_idx(non_col)); |
1838 | 1839 |
1839 temp_result_idx(non_col) -= num_lgt; | 1840 temp_result_idx(non_col) -= num_lgt; |
1840 | 1841 |
1841 int kidx | 1842 octave_idx_type kidx |
1842 = ::compute_index (temp_result_idx, new_lhs_dim); | 1843 = ::compute_index (temp_result_idx, new_lhs_dim); |
1843 | 1844 |
1844 new_data[kidx] = elem (result_idx); | 1845 new_data[kidx] = elem (result_idx); |
1845 } | 1846 } |
1846 | 1847 |
1868 // column by column. | 1869 // column by column. |
1869 // | 1870 // |
1870 // A(3,3,3)=2; | 1871 // A(3,3,3)=2; |
1871 // A(3:5) = []; A(6)=[] | 1872 // A(3:5) = []; A(6)=[] |
1872 | 1873 |
1873 int lhs_numel = numel (); | 1874 octave_idx_type lhs_numel = numel (); |
1874 | 1875 |
1875 idx_vector idx_vec = ra_idx(0); | 1876 idx_vector idx_vec = ra_idx(0); |
1876 | 1877 |
1877 idx_vec.freeze (lhs_numel, 0, true, liboctave_wrore_flag); | 1878 idx_vec.freeze (lhs_numel, 0, true, liboctave_wrore_flag); |
1878 | 1879 |
1879 idx_vec.sort (true); | 1880 idx_vec.sort (true); |
1880 | 1881 |
1881 int num_to_delete = idx_vec.length (lhs_numel); | 1882 octave_idx_type num_to_delete = idx_vec.length (lhs_numel); |
1882 | 1883 |
1883 if (num_to_delete > 0) | 1884 if (num_to_delete > 0) |
1884 { | 1885 { |
1885 int new_numel = lhs_numel - num_to_delete; | 1886 octave_idx_type new_numel = lhs_numel - num_to_delete; |
1886 | 1887 |
1887 T *new_data = new T[new_numel]; | 1888 T *new_data = new T[new_numel]; |
1888 | 1889 |
1889 Array<int> lhs_ra_idx (ndims (), 0); | 1890 Array<octave_idx_type> lhs_ra_idx (ndims (), 0); |
1890 | 1891 |
1891 int ii = 0; | 1892 octave_idx_type ii = 0; |
1892 int iidx = 0; | 1893 octave_idx_type iidx = 0; |
1893 | 1894 |
1894 for (int i = 0; i < lhs_numel; i++) | 1895 for (octave_idx_type i = 0; i < lhs_numel; i++) |
1895 { | 1896 { |
1896 if (iidx < num_to_delete && i == idx_vec.elem (iidx)) | 1897 if (iidx < num_to_delete && i == idx_vec.elem (iidx)) |
1897 { | 1898 { |
1898 iidx++; | 1899 iidx++; |
1899 } | 1900 } |
1998 Array<T> | 1999 Array<T> |
1999 Array<T>::index1 (idx_vector& idx_arg, int resize_ok, const T& rfv) const | 2000 Array<T>::index1 (idx_vector& idx_arg, int resize_ok, const T& rfv) const |
2000 { | 2001 { |
2001 Array<T> retval; | 2002 Array<T> retval; |
2002 | 2003 |
2003 int len = length (); | 2004 octave_idx_type len = length (); |
2004 | 2005 |
2005 int n = idx_arg.freeze (len, "vector", resize_ok); | 2006 octave_idx_type n = idx_arg.freeze (len, "vector", resize_ok); |
2006 | 2007 |
2007 if (idx_arg) | 2008 if (idx_arg) |
2008 { | 2009 { |
2009 if (idx_arg.is_colon_equiv (len)) | 2010 if (idx_arg.is_colon_equiv (len)) |
2010 { | 2011 { |
2022 } | 2023 } |
2023 else | 2024 else |
2024 { | 2025 { |
2025 retval.resize_no_fill (n); | 2026 retval.resize_no_fill (n); |
2026 | 2027 |
2027 for (int i = 0; i < n; i++) | 2028 for (octave_idx_type i = 0; i < n; i++) |
2028 { | 2029 { |
2029 int ii = idx_arg.elem (i); | 2030 octave_idx_type ii = idx_arg.elem (i); |
2030 if (ii >= len) | 2031 if (ii >= len) |
2031 retval.elem (i) = rfv; | 2032 retval.elem (i) = rfv; |
2032 else | 2033 else |
2033 retval.elem (i) = elem (ii); | 2034 retval.elem (i) = elem (ii); |
2034 } | 2035 } |
2046 { | 2047 { |
2047 Array<T> retval; | 2048 Array<T> retval; |
2048 | 2049 |
2049 assert (ndims () == 2); | 2050 assert (ndims () == 2); |
2050 | 2051 |
2051 int nr = dim1 (); | 2052 octave_idx_type nr = dim1 (); |
2052 int nc = dim2 (); | 2053 octave_idx_type nc = dim2 (); |
2053 | 2054 |
2054 int orig_len = nr * nc; | 2055 octave_idx_type orig_len = nr * nc; |
2055 | 2056 |
2056 dim_vector idx_orig_dims = idx_arg.orig_dimensions (); | 2057 dim_vector idx_orig_dims = idx_arg.orig_dimensions (); |
2057 | 2058 |
2058 int idx_orig_rows = idx_arg.orig_rows (); | 2059 octave_idx_type idx_orig_rows = idx_arg.orig_rows (); |
2059 int idx_orig_columns = idx_arg.orig_columns (); | 2060 octave_idx_type idx_orig_columns = idx_arg.orig_columns (); |
2060 | 2061 |
2061 if (idx_arg.is_colon ()) | 2062 if (idx_arg.is_colon ()) |
2062 { | 2063 { |
2063 // Fast magic colon processing. | 2064 // Fast magic colon processing. |
2064 | 2065 |
2065 int result_nr = nr * nc; | 2066 octave_idx_type result_nr = nr * nc; |
2066 int result_nc = 1; | 2067 octave_idx_type result_nc = 1; |
2067 | 2068 |
2068 retval = Array<T> (*this, dim_vector (result_nr, result_nc)); | 2069 retval = Array<T> (*this, dim_vector (result_nr, result_nc)); |
2069 } | 2070 } |
2070 else if (nr == 1 && nc == 1) | 2071 else if (nr == 1 && nc == 1) |
2071 { | 2072 { |
2072 Array<T> tmp = Array<T>::index1 (idx_arg, resize_ok); | 2073 Array<T> tmp = Array<T>::index1 (idx_arg, resize_ok); |
2073 | 2074 |
2074 int len = tmp.length (); | 2075 octave_idx_type len = tmp.length (); |
2075 | 2076 |
2076 if (len == 0 && idx_arg.one_zero_only ()) | 2077 if (len == 0 && idx_arg.one_zero_only ()) |
2077 retval = Array<T> (tmp, dim_vector (0, 0)); | 2078 retval = Array<T> (tmp, dim_vector (0, 0)); |
2078 else if (len >= idx_orig_dims.numel ()) | 2079 else if (len >= idx_orig_dims.numel ()) |
2079 retval = Array<T> (tmp, idx_orig_dims); | 2080 retval = Array<T> (tmp, idx_orig_dims); |
2084 // shape as the index. Otherwise, it has same orientation as | 2085 // shape as the index. Otherwise, it has same orientation as |
2085 // indexed object. | 2086 // indexed object. |
2086 | 2087 |
2087 Array<T> tmp = Array<T>::index1 (idx_arg, resize_ok); | 2088 Array<T> tmp = Array<T>::index1 (idx_arg, resize_ok); |
2088 | 2089 |
2089 int len = tmp.length (); | 2090 octave_idx_type len = tmp.length (); |
2090 | 2091 |
2091 if ((len != 0 && idx_arg.one_zero_only ()) | 2092 if ((len != 0 && idx_arg.one_zero_only ()) |
2092 || idx_orig_rows == 1 || idx_orig_columns == 1) | 2093 || idx_orig_rows == 1 || idx_orig_columns == 1) |
2093 { | 2094 { |
2094 if (nr == 1) | 2095 if (nr == 1) |
2112 | 2113 |
2113 idx_arg.freeze (nr * nc, "matrix", resize_ok); | 2114 idx_arg.freeze (nr * nc, "matrix", resize_ok); |
2114 | 2115 |
2115 if (idx_arg) | 2116 if (idx_arg) |
2116 { | 2117 { |
2117 int result_nr = idx_orig_rows; | 2118 octave_idx_type result_nr = idx_orig_rows; |
2118 int result_nc = idx_orig_columns; | 2119 octave_idx_type result_nc = idx_orig_columns; |
2119 | 2120 |
2120 if (idx_arg.one_zero_only ()) | 2121 if (idx_arg.one_zero_only ()) |
2121 { | 2122 { |
2122 result_nr = idx_arg.ones_count (); | 2123 result_nr = idx_arg.ones_count (); |
2123 result_nc = (result_nr > 0 ? 1 : 0); | 2124 result_nc = (result_nr > 0 ? 1 : 0); |
2124 } | 2125 } |
2125 | 2126 |
2126 retval.resize_no_fill (result_nr, result_nc); | 2127 retval.resize_no_fill (result_nr, result_nc); |
2127 | 2128 |
2128 int k = 0; | 2129 octave_idx_type k = 0; |
2129 for (int j = 0; j < result_nc; j++) | 2130 for (octave_idx_type j = 0; j < result_nc; j++) |
2130 { | 2131 { |
2131 for (int i = 0; i < result_nr; i++) | 2132 for (octave_idx_type i = 0; i < result_nr; i++) |
2132 { | 2133 { |
2133 int ii = idx_arg.elem (k++); | 2134 octave_idx_type ii = idx_arg.elem (k++); |
2134 if (ii >= orig_len) | 2135 if (ii >= orig_len) |
2135 retval.elem (i, j) = rfv; | 2136 retval.elem (i, j) = rfv; |
2136 else | 2137 else |
2137 { | 2138 { |
2138 int fr = ii % nr; | 2139 octave_idx_type fr = ii % nr; |
2139 int fc = (ii - fr) / nr; | 2140 octave_idx_type fc = (ii - fr) / nr; |
2140 retval.elem (i, j) = elem (fr, fc); | 2141 retval.elem (i, j) = elem (fr, fc); |
2141 } | 2142 } |
2142 } | 2143 } |
2143 } | 2144 } |
2144 } | 2145 } |
2154 { | 2155 { |
2155 Array<T> retval; | 2156 Array<T> retval; |
2156 | 2157 |
2157 int n_dims = dims().length (); | 2158 int n_dims = dims().length (); |
2158 | 2159 |
2159 int orig_len = dims().numel (); | 2160 octave_idx_type orig_len = dims().numel (); |
2160 | 2161 |
2161 dim_vector idx_orig_dims = ra_idx.orig_dimensions (); | 2162 dim_vector idx_orig_dims = ra_idx.orig_dimensions (); |
2162 | 2163 |
2163 if (ra_idx.is_colon ()) | 2164 if (ra_idx.is_colon ()) |
2164 { | 2165 { |
2170 { | 2171 { |
2171 // Only one element in array. | 2172 // Only one element in array. |
2172 | 2173 |
2173 Array<T> tmp = Array<T>::index (ra_idx, resize_ok); | 2174 Array<T> tmp = Array<T>::index (ra_idx, resize_ok); |
2174 | 2175 |
2175 int len = tmp.length (); | 2176 octave_idx_type len = tmp.length (); |
2176 | 2177 |
2177 if (len != 0) | 2178 if (len != 0) |
2178 { | 2179 { |
2179 if (len >= idx_orig_dims.numel ()) | 2180 if (len >= idx_orig_dims.numel ()) |
2180 retval = Array<T> (tmp, idx_orig_dims); | 2181 retval = Array<T> (tmp, idx_orig_dims); |
2186 { | 2187 { |
2187 // We're getting elements from a vector equivalent i.e. (1x4x1). | 2188 // We're getting elements from a vector equivalent i.e. (1x4x1). |
2188 | 2189 |
2189 Array<T> tmp = Array<T>::index (ra_idx, resize_ok); | 2190 Array<T> tmp = Array<T>::index (ra_idx, resize_ok); |
2190 | 2191 |
2191 int len = tmp.length (); | 2192 octave_idx_type len = tmp.length (); |
2192 | 2193 |
2193 if (len == 0) | 2194 if (len == 0) |
2194 { | 2195 { |
2195 if (idx_orig_dims.any_zero ()) | 2196 if (idx_orig_dims.any_zero ()) |
2196 retval = Array<T> (idx_orig_dims); | 2197 retval = Array<T> (idx_orig_dims); |
2252 dim_vector result_dims (idx_orig_dims); | 2253 dim_vector result_dims (idx_orig_dims); |
2253 | 2254 |
2254 if (ra_idx.one_zero_only ()) | 2255 if (ra_idx.one_zero_only ()) |
2255 { | 2256 { |
2256 result_dims.resize (2); | 2257 result_dims.resize (2); |
2257 int ntot = ra_idx.ones_count (); | 2258 octave_idx_type ntot = ra_idx.ones_count (); |
2258 result_dims(0) = ntot; | 2259 result_dims(0) = ntot; |
2259 result_dims(1) = (ntot > 0 ? 1 : 0); | 2260 result_dims(1) = (ntot > 0 ? 1 : 0); |
2260 } | 2261 } |
2261 | 2262 |
2262 result_dims.chop_trailing_singletons (); | 2263 result_dims.chop_trailing_singletons (); |
2263 | 2264 |
2264 retval.resize (result_dims); | 2265 retval.resize (result_dims); |
2265 | 2266 |
2266 int n = result_dims.numel (); | 2267 octave_idx_type n = result_dims.numel (); |
2267 | 2268 |
2268 int r_dims = result_dims.length (); | 2269 int r_dims = result_dims.length (); |
2269 | 2270 |
2270 Array<int> iidx (r_dims, 0); | 2271 Array<octave_idx_type> iidx (r_dims, 0); |
2271 | 2272 |
2272 int k = 0; | 2273 octave_idx_type k = 0; |
2273 | 2274 |
2274 for (int i = 0; i < n; i++) | 2275 for (octave_idx_type i = 0; i < n; i++) |
2275 { | 2276 { |
2276 int ii = ra_idx.elem (k++); | 2277 octave_idx_type ii = ra_idx.elem (k++); |
2277 | 2278 |
2278 if (ii >= orig_len) | 2279 if (ii >= orig_len) |
2279 retval.elem (iidx) = rfv; | 2280 retval.elem (iidx) = rfv; |
2280 else | 2281 else |
2281 { | 2282 { |
2299 { | 2300 { |
2300 Array<T> retval; | 2301 Array<T> retval; |
2301 | 2302 |
2302 assert (ndims () == 2); | 2303 assert (ndims () == 2); |
2303 | 2304 |
2304 int nr = dim1 (); | 2305 octave_idx_type nr = dim1 (); |
2305 int nc = dim2 (); | 2306 octave_idx_type nc = dim2 (); |
2306 | 2307 |
2307 int n = idx_i.freeze (nr, "row", resize_ok); | 2308 octave_idx_type n = idx_i.freeze (nr, "row", resize_ok); |
2308 int m = idx_j.freeze (nc, "column", resize_ok); | 2309 octave_idx_type m = idx_j.freeze (nc, "column", resize_ok); |
2309 | 2310 |
2310 if (idx_i && idx_j) | 2311 if (idx_i && idx_j) |
2311 { | 2312 { |
2312 if (idx_i.orig_empty () || idx_j.orig_empty () || n == 0 || m == 0) | 2313 if (idx_i.orig_empty () || idx_j.orig_empty () || n == 0 || m == 0) |
2313 { | 2314 { |
2319 } | 2320 } |
2320 else | 2321 else |
2321 { | 2322 { |
2322 retval.resize_no_fill (n, m); | 2323 retval.resize_no_fill (n, m); |
2323 | 2324 |
2324 for (int j = 0; j < m; j++) | 2325 for (octave_idx_type j = 0; j < m; j++) |
2325 { | 2326 { |
2326 int jj = idx_j.elem (j); | 2327 octave_idx_type jj = idx_j.elem (j); |
2327 for (int i = 0; i < n; i++) | 2328 for (octave_idx_type i = 0; i < n; i++) |
2328 { | 2329 { |
2329 int ii = idx_i.elem (i); | 2330 octave_idx_type ii = idx_i.elem (i); |
2330 if (ii >= nr || jj >= nc) | 2331 if (ii >= nr || jj >= nc) |
2331 retval.elem (i, j) = rfv; | 2332 retval.elem (i, j) = rfv; |
2332 else | 2333 else |
2333 retval.elem (i, j) = elem (ii, jj); | 2334 retval.elem (i, j) = elem (ii, jj); |
2334 } | 2335 } |
2353 int n_dims = dimensions.length (); | 2354 int n_dims = dimensions.length (); |
2354 | 2355 |
2355 // Remove trailing singletons in ra_idx, but leave at least ndims | 2356 // Remove trailing singletons in ra_idx, but leave at least ndims |
2356 // elements. | 2357 // elements. |
2357 | 2358 |
2358 int ra_idx_len = ra_idx.length (); | 2359 octave_idx_type ra_idx_len = ra_idx.length (); |
2359 | 2360 |
2360 bool trim_trailing_singletons = true; | 2361 bool trim_trailing_singletons = true; |
2361 for (int j = ra_idx_len; j > n_dims; j--) | 2362 for (octave_idx_type j = ra_idx_len; j > n_dims; j--) |
2362 { | 2363 { |
2363 idx_vector iidx = ra_idx (ra_idx_len-1); | 2364 idx_vector iidx = ra_idx (ra_idx_len-1); |
2364 if (iidx.capacity () == 1 && trim_trailing_singletons) | 2365 if (iidx.capacity () == 1 && trim_trailing_singletons) |
2365 ra_idx_len--; | 2366 ra_idx_len--; |
2366 else | 2367 else |
2367 trim_trailing_singletons = false; | 2368 trim_trailing_singletons = false; |
2368 | 2369 |
2369 for (int i = 0; i < iidx.capacity (); i++) | 2370 for (octave_idx_type i = 0; i < iidx.capacity (); i++) |
2370 if (iidx (i) != 0) | 2371 if (iidx (i) != 0) |
2371 { | 2372 { |
2372 (*current_liboctave_error_handler) | 2373 (*current_liboctave_error_handler) |
2373 ("index exceeds N-d array dimensions"); | 2374 ("index exceeds N-d array dimensions"); |
2374 | 2375 |
2408 | 2409 |
2409 frozen_lengths_for_resize.chop_trailing_singletons (); | 2410 frozen_lengths_for_resize.chop_trailing_singletons (); |
2410 | 2411 |
2411 retval.resize (frozen_lengths_for_resize); | 2412 retval.resize (frozen_lengths_for_resize); |
2412 | 2413 |
2413 int n = retval.length (); | 2414 octave_idx_type n = retval.length (); |
2414 | 2415 |
2415 Array<int> result_idx (ra_idx.length (), 0); | 2416 Array<octave_idx_type> result_idx (ra_idx.length (), 0); |
2416 | 2417 |
2417 Array<int> elt_idx; | 2418 Array<octave_idx_type> elt_idx; |
2418 | 2419 |
2419 for (int i = 0; i < n; i++) | 2420 for (octave_idx_type i = 0; i < n; i++) |
2420 { | 2421 { |
2421 elt_idx = get_elt_idx (ra_idx, result_idx); | 2422 elt_idx = get_elt_idx (ra_idx, result_idx); |
2422 | 2423 |
2423 int numelem_elt = get_scalar_idx (elt_idx, new_dims); | 2424 octave_idx_type numelem_elt = get_scalar_idx (elt_idx, new_dims); |
2424 | 2425 |
2425 if (numelem_elt > length () || numelem_elt < 0) | 2426 if (numelem_elt > length () || numelem_elt < 0) |
2426 (*current_liboctave_error_handler) | 2427 (*current_liboctave_error_handler) |
2427 ("invalid N-d array index"); | 2428 ("invalid N-d array index"); |
2428 else | 2429 else |
2494 | 2495 |
2495 idx_vector *tmp = lhs.get_idx (); | 2496 idx_vector *tmp = lhs.get_idx (); |
2496 | 2497 |
2497 idx_vector lhs_idx = tmp[0]; | 2498 idx_vector lhs_idx = tmp[0]; |
2498 | 2499 |
2499 int lhs_len = lhs.length (); | 2500 octave_idx_type lhs_len = lhs.length (); |
2500 int rhs_len = rhs.length (); | 2501 octave_idx_type rhs_len = rhs.length (); |
2501 | 2502 |
2502 int n = lhs_idx.freeze (lhs_len, "vector", true, liboctave_wrore_flag); | 2503 octave_idx_type n = lhs_idx.freeze (lhs_len, "vector", true, liboctave_wrore_flag); |
2503 | 2504 |
2504 if (n != 0) | 2505 if (n != 0) |
2505 { | 2506 { |
2506 if (rhs_len == n || rhs_len == 1) | 2507 if (rhs_len == n || rhs_len == 1) |
2507 { | 2508 { |
2508 int max_idx = lhs_idx.max () + 1; | 2509 octave_idx_type max_idx = lhs_idx.max () + 1; |
2509 if (max_idx > lhs_len) | 2510 if (max_idx > lhs_len) |
2510 lhs.resize_and_fill (max_idx, rfv); | 2511 lhs.resize_and_fill (max_idx, rfv); |
2511 } | 2512 } |
2512 | 2513 |
2513 if (rhs_len == n) | 2514 if (rhs_len == n) |
2514 { | 2515 { |
2515 for (int i = 0; i < n; i++) | 2516 for (octave_idx_type i = 0; i < n; i++) |
2516 { | 2517 { |
2517 int ii = lhs_idx.elem (i); | 2518 octave_idx_type ii = lhs_idx.elem (i); |
2518 lhs.elem (ii) = rhs.elem (i); | 2519 lhs.elem (ii) = rhs.elem (i); |
2519 } | 2520 } |
2520 } | 2521 } |
2521 else if (rhs_len == 1) | 2522 else if (rhs_len == 1) |
2522 { | 2523 { |
2523 RT scalar = rhs.elem (0); | 2524 RT scalar = rhs.elem (0); |
2524 | 2525 |
2525 for (int i = 0; i < n; i++) | 2526 for (octave_idx_type i = 0; i < n; i++) |
2526 { | 2527 { |
2527 int ii = lhs_idx.elem (i); | 2528 octave_idx_type ii = lhs_idx.elem (i); |
2528 lhs.elem (ii) = scalar; | 2529 lhs.elem (ii) = scalar; |
2529 } | 2530 } |
2530 } | 2531 } |
2531 else | 2532 else |
2532 { | 2533 { |
2540 { | 2541 { |
2541 if (lhs_len == 0) | 2542 if (lhs_len == 0) |
2542 { | 2543 { |
2543 lhs.resize_no_fill (rhs_len); | 2544 lhs.resize_no_fill (rhs_len); |
2544 | 2545 |
2545 for (int i = 0; i < rhs_len; i++) | 2546 for (octave_idx_type i = 0; i < rhs_len; i++) |
2546 lhs.elem (i) = rhs.elem (i); | 2547 lhs.elem (i) = rhs.elem (i); |
2547 } | 2548 } |
2548 else | 2549 else |
2549 (*current_liboctave_error_handler) | 2550 (*current_liboctave_error_handler) |
2550 ("A(:) = X: A must be the same size as X"); | 2551 ("A(:) = X: A must be the same size as X"); |
2563 } | 2564 } |
2564 | 2565 |
2565 #define MAYBE_RESIZE_LHS \ | 2566 #define MAYBE_RESIZE_LHS \ |
2566 do \ | 2567 do \ |
2567 { \ | 2568 { \ |
2568 int max_row_idx = idx_i_is_colon ? rhs_nr : idx_i.max () + 1; \ | 2569 octave_idx_type max_row_idx = idx_i_is_colon ? rhs_nr : idx_i.max () + 1; \ |
2569 int max_col_idx = idx_j_is_colon ? rhs_nc : idx_j.max () + 1; \ | 2570 octave_idx_type max_col_idx = idx_j_is_colon ? rhs_nc : idx_j.max () + 1; \ |
2570 \ | 2571 \ |
2571 int new_nr = max_row_idx > lhs_nr ? max_row_idx : lhs_nr; \ | 2572 octave_idx_type new_nr = max_row_idx > lhs_nr ? max_row_idx : lhs_nr; \ |
2572 int new_nc = max_col_idx > lhs_nc ? max_col_idx : lhs_nc; \ | 2573 octave_idx_type new_nc = max_col_idx > lhs_nc ? max_col_idx : lhs_nc; \ |
2573 \ | 2574 \ |
2574 lhs.resize_and_fill (new_nr, new_nc, rfv); \ | 2575 lhs.resize_and_fill (new_nr, new_nc, rfv); \ |
2575 } \ | 2576 } \ |
2576 while (0) | 2577 while (0) |
2577 | 2578 |
2581 { | 2582 { |
2582 int retval = 1; | 2583 int retval = 1; |
2583 | 2584 |
2584 int n_idx = lhs.index_count (); | 2585 int n_idx = lhs.index_count (); |
2585 | 2586 |
2586 int lhs_nr = lhs.rows (); | 2587 octave_idx_type lhs_nr = lhs.rows (); |
2587 int lhs_nc = lhs.cols (); | 2588 octave_idx_type lhs_nc = lhs.cols (); |
2588 | 2589 |
2589 Array<RT> xrhs = rhs; | 2590 Array<RT> xrhs = rhs; |
2590 | 2591 |
2591 int rhs_nr = xrhs.rows (); | 2592 octave_idx_type rhs_nr = xrhs.rows (); |
2592 int rhs_nc = xrhs.cols (); | 2593 octave_idx_type rhs_nc = xrhs.cols (); |
2593 | 2594 |
2594 if (xrhs.ndims () > 2) | 2595 if (xrhs.ndims () > 2) |
2595 { | 2596 { |
2596 xrhs = xrhs.squeeze (); | 2597 xrhs = xrhs.squeeze (); |
2597 | 2598 |
2629 if (n_idx > 0) | 2630 if (n_idx > 0) |
2630 idx_i = tmp[0]; | 2631 idx_i = tmp[0]; |
2631 | 2632 |
2632 if (n_idx == 2) | 2633 if (n_idx == 2) |
2633 { | 2634 { |
2634 int n = idx_i.freeze (lhs_nr, "row", true, liboctave_wrore_flag); | 2635 octave_idx_type n = idx_i.freeze (lhs_nr, "row", true, liboctave_wrore_flag); |
2635 | 2636 |
2636 int m = idx_j.freeze (lhs_nc, "column", true, liboctave_wrore_flag); | 2637 octave_idx_type m = idx_j.freeze (lhs_nc, "column", true, liboctave_wrore_flag); |
2637 | 2638 |
2638 int idx_i_is_colon = idx_i.is_colon (); | 2639 int idx_i_is_colon = idx_i.is_colon (); |
2639 int idx_j_is_colon = idx_j.is_colon (); | 2640 int idx_j_is_colon = idx_j.is_colon (); |
2640 | 2641 |
2641 if (idx_i_is_colon) | 2642 if (idx_i_is_colon) |
2661 { | 2662 { |
2662 MAYBE_RESIZE_LHS; | 2663 MAYBE_RESIZE_LHS; |
2663 | 2664 |
2664 RT scalar = xrhs.elem (0, 0); | 2665 RT scalar = xrhs.elem (0, 0); |
2665 | 2666 |
2666 for (int j = 0; j < m; j++) | 2667 for (octave_idx_type j = 0; j < m; j++) |
2667 { | 2668 { |
2668 int jj = idx_j.elem (j); | 2669 octave_idx_type jj = idx_j.elem (j); |
2669 for (int i = 0; i < n; i++) | 2670 for (octave_idx_type i = 0; i < n; i++) |
2670 { | 2671 { |
2671 int ii = idx_i.elem (i); | 2672 octave_idx_type ii = idx_i.elem (i); |
2672 lhs.elem (ii, jj) = scalar; | 2673 lhs.elem (ii, jj) = scalar; |
2673 } | 2674 } |
2674 } | 2675 } |
2675 } | 2676 } |
2676 } | 2677 } |
2678 { | 2679 { |
2679 if (n > 0 && m > 0) | 2680 if (n > 0 && m > 0) |
2680 { | 2681 { |
2681 MAYBE_RESIZE_LHS; | 2682 MAYBE_RESIZE_LHS; |
2682 | 2683 |
2683 for (int j = 0; j < m; j++) | 2684 for (octave_idx_type j = 0; j < m; j++) |
2684 { | 2685 { |
2685 int jj = idx_j.elem (j); | 2686 octave_idx_type jj = idx_j.elem (j); |
2686 for (int i = 0; i < n; i++) | 2687 for (octave_idx_type i = 0; i < n; i++) |
2687 { | 2688 { |
2688 int ii = idx_i.elem (i); | 2689 octave_idx_type ii = idx_i.elem (i); |
2689 lhs.elem (ii, jj) = xrhs.elem (i, j); | 2690 lhs.elem (ii, jj) = xrhs.elem (i, j); |
2690 } | 2691 } |
2691 } | 2692 } |
2692 } | 2693 } |
2693 } | 2694 } |
2721 { | 2722 { |
2722 int lhs_is_empty = lhs_nr == 0 || lhs_nc == 0; | 2723 int lhs_is_empty = lhs_nr == 0 || lhs_nc == 0; |
2723 | 2724 |
2724 if (lhs_is_empty || (lhs_nr == 1 && lhs_nc == 1)) | 2725 if (lhs_is_empty || (lhs_nr == 1 && lhs_nc == 1)) |
2725 { | 2726 { |
2726 int lhs_len = lhs.length (); | 2727 octave_idx_type lhs_len = lhs.length (); |
2727 | 2728 |
2728 int n = idx_i.freeze (lhs_len, 0, true, liboctave_wrore_flag); | 2729 octave_idx_type n = idx_i.freeze (lhs_len, 0, true, liboctave_wrore_flag); |
2729 | 2730 |
2730 if (idx_i) | 2731 if (idx_i) |
2731 { | 2732 { |
2732 if (rhs_nr == 0 && rhs_nc == 0) | 2733 if (rhs_nr == 0 && rhs_nc == 0) |
2733 { | 2734 { |
2745 (*current_liboctave_warning_handler) | 2746 (*current_liboctave_warning_handler) |
2746 ("A(:) = X: X is not a vector or scalar"); | 2747 ("A(:) = X: X is not a vector or scalar"); |
2747 } | 2748 } |
2748 else | 2749 else |
2749 { | 2750 { |
2750 int idx_nr = idx_i.orig_rows (); | 2751 octave_idx_type idx_nr = idx_i.orig_rows (); |
2751 int idx_nc = idx_i.orig_columns (); | 2752 octave_idx_type idx_nc = idx_i.orig_columns (); |
2752 | 2753 |
2753 if (! (rhs_nr == idx_nr && rhs_nc == idx_nc)) | 2754 if (! (rhs_nr == idx_nr && rhs_nc == idx_nc)) |
2754 (*current_liboctave_warning_handler) | 2755 (*current_liboctave_warning_handler) |
2755 ("A(I) = X: X does not have same shape as I"); | 2756 ("A(I) = X: X does not have same shape as I"); |
2756 } | 2757 } |
2757 } | 2758 } |
2758 | 2759 |
2759 if (assign1 (lhs, xrhs, rfv)) | 2760 if (assign1 (lhs, xrhs, rfv)) |
2760 { | 2761 { |
2761 int len = lhs.length (); | 2762 octave_idx_type len = lhs.length (); |
2762 | 2763 |
2763 if (len > 0) | 2764 if (len > 0) |
2764 { | 2765 { |
2765 // The following behavior is much simplified | 2766 // The following behavior is much simplified |
2766 // over previous versions of Octave. It | 2767 // over previous versions of Octave. It |
2821 && idx_i.orig_rows () == lhs_nr | 2822 && idx_i.orig_rows () == lhs_nr |
2822 && idx_i.orig_columns () == lhs_nc))) | 2823 && idx_i.orig_columns () == lhs_nc))) |
2823 (*current_liboctave_warning_handler) | 2824 (*current_liboctave_warning_handler) |
2824 ("single index used for matrix"); | 2825 ("single index used for matrix"); |
2825 | 2826 |
2826 int len = idx_i.freeze (lhs_nr * lhs_nc, "matrix"); | 2827 octave_idx_type len = idx_i.freeze (lhs_nr * lhs_nc, "matrix"); |
2827 | 2828 |
2828 if (idx_i) | 2829 if (idx_i) |
2829 { | 2830 { |
2830 if (rhs_nr == 0 && rhs_nc == 0) | 2831 if (rhs_nr == 0 && rhs_nc == 0) |
2831 lhs.maybe_delete_elements (idx_i); | 2832 lhs.maybe_delete_elements (idx_i); |
2836 (*current_liboctave_error_handler) | 2837 (*current_liboctave_error_handler) |
2837 ("A([]) = X: X must be an empty matrix or scalar"); | 2838 ("A([]) = X: X must be an empty matrix or scalar"); |
2838 } | 2839 } |
2839 else if (len == rhs_nr * rhs_nc) | 2840 else if (len == rhs_nr * rhs_nc) |
2840 { | 2841 { |
2841 int k = 0; | 2842 octave_idx_type k = 0; |
2842 for (int j = 0; j < rhs_nc; j++) | 2843 for (octave_idx_type j = 0; j < rhs_nc; j++) |
2843 { | 2844 { |
2844 for (int i = 0; i < rhs_nr; i++) | 2845 for (octave_idx_type i = 0; i < rhs_nr; i++) |
2845 { | 2846 { |
2846 int ii = idx_i.elem (k++); | 2847 octave_idx_type ii = idx_i.elem (k++); |
2847 int fr = ii % lhs_nr; | 2848 octave_idx_type fr = ii % lhs_nr; |
2848 int fc = (ii - fr) / lhs_nr; | 2849 octave_idx_type fc = (ii - fr) / lhs_nr; |
2849 lhs.elem (fr, fc) = xrhs.elem (i, j); | 2850 lhs.elem (fr, fc) = xrhs.elem (i, j); |
2850 } | 2851 } |
2851 } | 2852 } |
2852 } | 2853 } |
2853 else if (rhs_nr == 1 && rhs_nc == 1) | 2854 else if (rhs_nr == 1 && rhs_nc == 1) |
2854 { | 2855 { |
2855 RT scalar = rhs.elem (0, 0); | 2856 RT scalar = rhs.elem (0, 0); |
2856 | 2857 |
2857 for (int i = 0; i < len; i++) | 2858 for (octave_idx_type i = 0; i < len; i++) |
2858 { | 2859 { |
2859 int ii = idx_i.elem (i); | 2860 octave_idx_type ii = idx_i.elem (i); |
2860 lhs.elem (ii) = scalar; | 2861 lhs.elem (ii) = scalar; |
2861 } | 2862 } |
2862 } | 2863 } |
2863 else | 2864 else |
2864 { | 2865 { |
2890 { | 2891 { |
2891 int retval = 1; | 2892 int retval = 1; |
2892 | 2893 |
2893 dim_vector rhs_dims = rhs.dims (); | 2894 dim_vector rhs_dims = rhs.dims (); |
2894 | 2895 |
2895 int rhs_dims_len = rhs_dims.length (); | 2896 octave_idx_type rhs_dims_len = rhs_dims.length (); |
2896 | 2897 |
2897 bool rhs_is_scalar = is_scalar (rhs_dims); | 2898 bool rhs_is_scalar = is_scalar (rhs_dims); |
2898 | 2899 |
2899 int n_idx = lhs.index_count (); | 2900 int n_idx = lhs.index_count (); |
2900 | 2901 |
2915 || (iidx.one_zero_only () | 2916 || (iidx.one_zero_only () |
2916 && iidx.orig_dimensions () == lhs.dims ()))) | 2917 && iidx.orig_dimensions () == lhs.dims ()))) |
2917 (*current_liboctave_warning_handler) | 2918 (*current_liboctave_warning_handler) |
2918 ("single index used for N-d array"); | 2919 ("single index used for N-d array"); |
2919 | 2920 |
2920 int lhs_len = lhs.length (); | 2921 octave_idx_type lhs_len = lhs.length (); |
2921 | 2922 |
2922 int len = iidx.freeze (lhs_len, "N-d arrray"); | 2923 octave_idx_type len = iidx.freeze (lhs_len, "N-d arrray"); |
2923 | 2924 |
2924 if (iidx) | 2925 if (iidx) |
2925 { | 2926 { |
2926 if (len == 0) | 2927 if (len == 0) |
2927 { | 2928 { |
2933 retval = 0; | 2934 retval = 0; |
2934 } | 2935 } |
2935 } | 2936 } |
2936 else if (len == rhs.length ()) | 2937 else if (len == rhs.length ()) |
2937 { | 2938 { |
2938 for (int i = 0; i < len; i++) | 2939 for (octave_idx_type i = 0; i < len; i++) |
2939 { | 2940 { |
2940 int ii = iidx.elem (i); | 2941 octave_idx_type ii = iidx.elem (i); |
2941 | 2942 |
2942 lhs.elem (ii) = rhs.elem (i); | 2943 lhs.elem (ii) = rhs.elem (i); |
2943 } | 2944 } |
2944 } | 2945 } |
2945 else if (rhs_is_scalar) | 2946 else if (rhs_is_scalar) |
2946 { | 2947 { |
2947 RT scalar = rhs.elem (0); | 2948 RT scalar = rhs.elem (0); |
2948 | 2949 |
2949 for (int i = 0; i < len; i++) | 2950 for (octave_idx_type i = 0; i < len; i++) |
2950 { | 2951 { |
2951 int ii = iidx.elem (i); | 2952 octave_idx_type ii = iidx.elem (i); |
2952 | 2953 |
2953 lhs.elem (ii) = scalar; | 2954 lhs.elem (ii) = scalar; |
2954 } | 2955 } |
2955 } | 2956 } |
2956 else | 2957 else |
2968 { | 2969 { |
2969 // Maybe expand to more dimensions. | 2970 // Maybe expand to more dimensions. |
2970 | 2971 |
2971 dim_vector lhs_dims = lhs.dims (); | 2972 dim_vector lhs_dims = lhs.dims (); |
2972 | 2973 |
2973 int lhs_dims_len = lhs_dims.length (); | 2974 octave_idx_type lhs_dims_len = lhs_dims.length (); |
2974 | 2975 |
2975 dim_vector final_lhs_dims = lhs_dims; | 2976 dim_vector final_lhs_dims = lhs_dims; |
2976 | 2977 |
2977 dim_vector frozen_len; | 2978 dim_vector frozen_len; |
2978 | 2979 |
2979 int orig_lhs_dims_len = lhs_dims_len; | 2980 octave_idx_type orig_lhs_dims_len = lhs_dims_len; |
2980 | 2981 |
2981 bool orig_empty = lhs_dims.all_zero (); | 2982 bool orig_empty = lhs_dims.all_zero (); |
2982 | 2983 |
2983 if (n_idx < lhs_dims_len) | 2984 if (n_idx < lhs_dims_len) |
2984 { | 2985 { |
3087 { | 3088 { |
3088 lhs.resize_and_fill (new_dims, rfv); | 3089 lhs.resize_and_fill (new_dims, rfv); |
3089 | 3090 |
3090 if (! final_lhs_dims.any_zero ()) | 3091 if (! final_lhs_dims.any_zero ()) |
3091 { | 3092 { |
3092 int n = Array<LT>::get_size (frozen_len); | 3093 octave_idx_type n = Array<LT>::get_size (frozen_len); |
3093 | 3094 |
3094 Array<int> result_idx (lhs_dims_len, 0); | 3095 Array<octave_idx_type> result_idx (lhs_dims_len, 0); |
3095 | 3096 |
3096 RT scalar = rhs.elem (0); | 3097 RT scalar = rhs.elem (0); |
3097 | 3098 |
3098 for (int i = 0; i < n; i++) | 3099 for (octave_idx_type i = 0; i < n; i++) |
3099 { | 3100 { |
3100 Array<int> elt_idx = get_elt_idx (idx, result_idx); | 3101 Array<octave_idx_type> elt_idx = get_elt_idx (idx, result_idx); |
3101 | 3102 |
3102 lhs.elem (elt_idx) = scalar; | 3103 lhs.elem (elt_idx) = scalar; |
3103 | 3104 |
3104 increment_index (result_idx, frozen_len); | 3105 increment_index (result_idx, frozen_len); |
3105 } | 3106 } |
3107 } | 3108 } |
3108 else | 3109 else |
3109 { | 3110 { |
3110 // RHS is matrix or higher dimension. | 3111 // RHS is matrix or higher dimension. |
3111 | 3112 |
3112 int n = Array<LT>::get_size (frozen_len); | 3113 octave_idx_type n = Array<LT>::get_size (frozen_len); |
3113 | 3114 |
3114 if (n != rhs.numel ()) | 3115 if (n != rhs.numel ()) |
3115 { | 3116 { |
3116 (*current_liboctave_error_handler) | 3117 (*current_liboctave_error_handler) |
3117 ("A(IDX-LIST) = X: X must be a scalar or size of X must equal number of elements indexed by IDX-LIST"); | 3118 ("A(IDX-LIST) = X: X must be a scalar or size of X must equal number of elements indexed by IDX-LIST"); |
3124 | 3125 |
3125 if (! final_lhs_dims.any_zero ()) | 3126 if (! final_lhs_dims.any_zero ()) |
3126 { | 3127 { |
3127 n = Array<LT>::get_size (frozen_len); | 3128 n = Array<LT>::get_size (frozen_len); |
3128 | 3129 |
3129 Array<int> result_idx (lhs_dims_len, 0); | 3130 Array<octave_idx_type> result_idx (lhs_dims_len, 0); |
3130 | 3131 |
3131 for (int i = 0; i < n; i++) | 3132 for (octave_idx_type i = 0; i < n; i++) |
3132 { | 3133 { |
3133 Array<int> elt_idx = get_elt_idx (idx, result_idx); | 3134 Array<octave_idx_type> elt_idx = get_elt_idx (idx, result_idx); |
3134 | 3135 |
3135 lhs.elem (elt_idx) = rhs.elem (i); | 3136 lhs.elem (elt_idx) = rhs.elem (i); |
3136 | 3137 |
3137 increment_index (result_idx, frozen_len); | 3138 increment_index (result_idx, frozen_len); |
3138 } | 3139 } |