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 {