Mercurial > hg > octave-lyh
comparison liboctave/Array.cc @ 7642:9a4541c622b5
refactor Array::assignN dimensioning code for empty initial matrices
author | David Bateman <dbateman@free.fr> |
---|---|
date | Tue, 25 Mar 2008 23:06:45 -0400 |
parents | 36594d5bbe13 |
children | ad16ea379d2f |
comparison
equal
deleted
inserted
replaced
7641:115563ecbdc9 | 7642:9a4541c622b5 |
---|---|
3349 dim_vector new_dims; | 3349 dim_vector new_dims; |
3350 new_dims.resize (n_idx); | 3350 new_dims.resize (n_idx); |
3351 | 3351 |
3352 if (orig_empty) | 3352 if (orig_empty) |
3353 { | 3353 { |
3354 int k = 0; | 3354 if (rhs_is_scalar) |
3355 for (int i = 0; i < n_idx; i++) | 3355 { |
3356 { | 3356 for (int i = 0; i < n_idx; i++) |
3357 // If index is a colon, resizing to RHS dimensions is | 3357 { |
3358 // allowed because we started out empty. | 3358 if (idx(i).is_colon ()) |
3359 | 3359 new_dims(i) = 1; |
3360 if (idx(i).is_colon ()) | |
3361 { | |
3362 if (k < rhs_dims.length ()) | |
3363 new_dims(i) = rhs_dims(k++); | |
3364 else | 3360 else |
3365 new_dims(i) = 1; | 3361 new_dims(i) = idx(i).orig_empty () ? 0 : idx(i).max () + 1; |
3362 } | |
3363 } | |
3364 else if (is_vector (rhs_dims)) | |
3365 { | |
3366 int ncolon = 0; | |
3367 int fcolon = 0; | |
3368 int lcolon = 0; | |
3369 for (int i = 0; i < n_idx; i++) | |
3370 if (idx(i).is_colon ()) | |
3371 { | |
3372 ncolon ++; | |
3373 if (ncolon == 1) | |
3374 fcolon = i; | |
3375 lcolon = i; | |
3376 new_dims (i) = 1; | |
3377 } | |
3378 else | |
3379 new_dims (i) = idx(i).capacity (); | |
3380 | |
3381 if (ncolon == n_idx) | |
3382 { | |
3383 new_dims = rhs_dims; | |
3384 new_dims.resize (n_idx); | |
3385 for (int i = rhs_dims_len; i < n_idx; i++) | |
3386 new_dims (i) = 1; | |
3366 } | 3387 } |
3367 else | 3388 else |
3368 { | 3389 { |
3369 octave_idx_type nelem = idx(i).capacity (); | 3390 octave_idx_type new_dims_numel = new_dims.numel (); |
3370 | 3391 octave_idx_type rhs_dims_numel = rhs_dims.numel (); |
3371 if (nelem >= 1 | 3392 bool is_vec = is_vector (new_dims); |
3372 && ((k < rhs_dims.length () && nelem == rhs_dims(k)) | 3393 |
3373 || rhs_is_scalar) || ! idx(i).is_colon()) | 3394 for (int i = 0; i < n_idx; i++) |
3374 k++; | 3395 new_dims(i) = idx(i).orig_empty () ? 0 : idx(i).max () + 1; |
3375 else if (! (nelem == 1 || rhs_is_scalar)) | 3396 |
3397 if (new_dims_numel != rhs_dims_numel && | |
3398 ncolon > 0 && new_dims_numel == 1) | |
3399 { | |
3400 if (ncolon == 2 && rhs_dims_len == 2 && | |
3401 rhs_dims(0) == 1) | |
3402 new_dims (lcolon) = rhs_dims_numel; | |
3403 else | |
3404 new_dims (fcolon) = rhs_dims_numel; | |
3405 } | |
3406 else if (new_dims_numel != rhs_dims_numel || !is_vec) | |
3376 { | 3407 { |
3377 (*current_liboctave_error_handler) | 3408 (*current_liboctave_error_handler) |
3378 ("A(IDX-LIST) = RHS: mismatched index and RHS dimension"); | 3409 ("A(IDX-LIST) = RHS: mismatched index and RHS dimension"); |
3379 return retval; | 3410 return retval; |
3380 } | 3411 } |
3381 | 3412 } |
3382 new_dims(i) = idx(i).orig_empty () ? 0 : idx(i).max () + 1; | 3413 } |
3414 else | |
3415 { | |
3416 int k = 0; | |
3417 for (int i = 0; i < n_idx; i++) | |
3418 { | |
3419 if (idx(i).is_colon ()) | |
3420 { | |
3421 if (k < rhs_dims_len) | |
3422 new_dims(i) = rhs_dims(k++); | |
3423 else | |
3424 new_dims(i) = 1; | |
3425 } | |
3426 else | |
3427 { | |
3428 octave_idx_type nelem = idx(i).capacity (); | |
3429 | |
3430 if (nelem >= 1 | |
3431 && (k < rhs_dims_len && nelem == rhs_dims(k))) | |
3432 k++; | |
3433 else if (nelem != 1) | |
3434 { | |
3435 (*current_liboctave_error_handler) | |
3436 ("A(IDX-LIST) = RHS: mismatched index and RHS dimension"); | |
3437 return retval; | |
3438 } | |
3439 new_dims(i) = idx(i).orig_empty () ? 0 : | |
3440 idx(i).max () + 1; | |
3441 } | |
3383 } | 3442 } |
3384 } | 3443 } |
3385 } | 3444 } |
3386 else | 3445 else |
3387 { | 3446 { |