# HG changeset patch # User jwe # Date 1069292903 0 # Node ID f2cd320cbf6e5deae9f684416613a94eaa6ea221 # Parent 79fe96966ca017751c22fac5b68ced95d8c31cf3 [project @ 2003-11-20 01:48:23 by jwe] diff -r 79fe96966ca0 -r f2cd320cbf6e liboctave/Array-util.cc --- a/liboctave/Array-util.cc Wed Nov 19 21:23:19 2003 +0000 +++ b/liboctave/Array-util.cc Thu Nov 20 01:48:23 2003 +0000 @@ -94,12 +94,14 @@ int num_ones (const Array& ra_idx) { - int retval (0); + int retval = 0; + for (int i = 0; i < ra_idx.length (); i++) { if (ra_idx (i) == 1) retval++; } + return retval; } diff -r 79fe96966ca0 -r f2cd320cbf6e liboctave/Array.cc --- a/liboctave/Array.cc Wed Nov 19 21:23:19 2003 +0000 +++ b/liboctave/Array.cc Thu Nov 20 01:48:23 2003 +0000 @@ -1447,7 +1447,7 @@ if (num_to_delete > 0) { - int temp = num_ones (lhs_dims); + int temp = lhs_dims.num_ones (); if (non_col_dim == 1) temp--; @@ -2688,130 +2688,122 @@ { // RHS is matrix or higher dimension. - // Subtracting number of dimensions of length 1 will catch - // cases where: A(2,1,2)=3 A(:,1,:)=[2,3;4,5] - - if (rhs_dims.length () - != num_ones (idx_is_colon_equiv) - num_ones (lhs_dims)) + bool dim_ok = true; + + int jj = 0; + + // Check that RHS dimensions are the same length as the + // corresponding LHS dimensions. + + int rhs_dims_len = rhs_dims.length (); + + for (int j = 0; j < idx_is_colon.length (); j++) { - (*current_liboctave_error_handler) - ("dimensions do not match in matrix assignment"); + if (idx_is_colon(j)) + { + if (jj > rhs_dims_len || rhs_dims(jj) < lhs_dims(j)) + { + dim_ok = false; + + break; + } + + jj++; + } } + + if (! dim_ok) + (*current_liboctave_error_handler) + ("subscripted assignment dimension mismatch"); else { - bool dim_ok = true; - - int jj = 0; - - // Check that RHS dimensions are the same length as the - // corresponding LHS dimensions. - - for (int j = 0; j < idx_is_colon.length (); j++) + dim_vector new_dims; + new_dims.resize (n_idx); + + bool resize = false; + + int ii = 0; + + // Update idx vectors. + + for (int i = 0; i < n_idx; i++) { - if (idx_is_colon(j) || idx_is_colon_equiv(j)) + if (idx(i).is_colon ()) { - if (rhs_dims(jj) < lhs_dims(j)) - { - dim_ok = false; - - break; - } - - jj++; + // Add appropriate idx_vector to idx(i) since + // index with : contains no indexes. + + frozen_len(i) + = lhs_dims(i) > rhs_dims(ii) ? lhs_dims(i) : rhs_dims(ii); + + new_dims(i) + = lhs_dims(i) > rhs_dims(ii) ? lhs_dims(i) : rhs_dims(ii); + + ii++; + + Range idxrange (1, frozen_len(i), 1); + + idx_vector idxv (idxrange); + + idx(i) = idxv; } - } - - if (! dim_ok) - (*current_liboctave_error_handler) - ("subscripted assignment dimension mismatch"); - else - { - dim_vector new_dims; - new_dims.resize (n_idx); - - bool resize = false; - - int ii = 0; - - // Update idx vectors. - - for (int i = 0; i < n_idx; i++) + else { - if (idx(i).is_colon ()) - { - // Add appropriate idx_vector to idx(i) since - // index with : contains no indexes. - - frozen_len(i) = lhs_dims(i) > rhs_dims(ii) ? lhs_dims(i) : rhs_dims(ii); - - new_dims(i) = lhs_dims(i) > rhs_dims(ii) ? lhs_dims(i) : rhs_dims(ii); - - ii++; - - Range idxrange (1, frozen_len(i), 1); - - idx_vector idxv (idxrange); - - idx(i) = idxv; - } - else - { - new_dims(i) = lhs_dims(i) > idx(i).max () + 1 ? lhs_dims(i) : idx(i).max () + 1; - - if (frozen_len(i) > 1) - ii++; - } - if (new_dims(i) != lhs_dims(i)) - resize = true; - } - - // Resize LHS if dimensions have changed. - - if (resize) - { - lhs.resize (new_dims, rfv); - - lhs_dims = lhs.dims (); + new_dims(i) = lhs_dims(i) > idx(i).max () + 1 ? lhs_dims(i) : idx(i).max () + 1; + + if (frozen_len(i) > 1) + ii++; } - - // Number of elements which need to be set. - - int n = Array::get_size (frozen_len); - - Array result_idx (lhs_dims.length (), 0); - Array elt_idx; - - Array result_rhs_idx (rhs_dims.length (), 0); - - dim_vector frozen_rhs; - frozen_rhs.resize (rhs_dims.length ()); - - for (int i = 0; i < rhs_dims.length (); i++) - frozen_rhs(i) = rhs_dims(i); - - dim_vector lhs_inc; - lhs_inc.resize (lhs_dims.length ()); - - for (int i = 0; i < lhs_dims.length (); i++) - lhs_inc(i) = lhs_dims(i) + 1; - - for (int i = 0; i < n; i++) + if (new_dims(i) != lhs_dims(i)) + resize = true; + } + + // Resize LHS if dimensions have changed. + + if (resize) + { + lhs.resize (new_dims, rfv); + + lhs_dims = lhs.dims (); + } + + // Number of elements which need to be set. + + int n = Array::get_size (frozen_len); + + Array result_idx (lhs_dims.length (), 0); + Array elt_idx; + + Array result_rhs_idx (rhs_dims.length (), 0); + + dim_vector frozen_rhs; + frozen_rhs.resize (rhs_dims.length ()); + + for (int i = 0; i < rhs_dims.length (); i++) + frozen_rhs(i) = rhs_dims(i); + + dim_vector lhs_inc; + lhs_inc.resize (lhs_dims.length ()); + + for (int i = 0; i < lhs_dims.length (); i++) + lhs_inc(i) = lhs_dims(i) + 1; + + for (int i = 0; i < n; i++) + { + elt_idx = get_elt_idx (idx, result_idx); + + if (index_in_bounds (elt_idx, lhs_inc)) { - elt_idx = get_elt_idx (idx, result_idx); - - if (index_in_bounds (elt_idx, lhs_inc)) - { - int s = compute_index (result_rhs_idx,rhs_dims); - - lhs.checkelem (elt_idx) = rhs.elem (s); - - increment_index (result_rhs_idx, frozen_rhs); - } - else - lhs.checkelem (elt_idx) = rfv; - - increment_index (result_idx, frozen_len); + int s = compute_index (result_rhs_idx,rhs_dims); + + lhs.checkelem (elt_idx) = rhs.elem (s); + + increment_index (result_rhs_idx, frozen_rhs); } + else + lhs.checkelem (elt_idx) = rfv; + + increment_index (result_idx, frozen_len); } } } diff -r 79fe96966ca0 -r f2cd320cbf6e liboctave/ChangeLog --- a/liboctave/ChangeLog Wed Nov 19 21:23:19 2003 +0000 +++ b/liboctave/ChangeLog Thu Nov 20 01:48:23 2003 +0000 @@ -1,5 +1,11 @@ 2003-11-19 John W. Eaton + * dim-vector.h (dim_vector::num_ones): New function. + * Array.cc (maybe_delete_elements): Use it instead of + num_ones (const Array&). + + * Array.cc (assignN): Omit dubious check of singleton dimensions. + * dNDArray.cc (NDArray::all_elements_are_int_or_inf_or_nan, NDArray::any_element_is_inf_or_nan, NDArray::too_large_for_float): New functions. diff -r 79fe96966ca0 -r f2cd320cbf6e liboctave/dim-vector.h --- a/liboctave/dim-vector.h Wed Nov 19 21:23:19 2003 +0000 +++ b/liboctave/dim-vector.h Thu Nov 20 01:48:23 2003 +0000 @@ -254,6 +254,18 @@ return retval; } + int + num_ones (void) const + { + int retval = 0; + + for (int i = 0; i < length (); i++) + if (elem (i) == 1) + retval++; + + return retval; + } + // This is the number of elements that a matrix with this dimension // vector would have, NOT the number of dimensions (elements in the // dimension vector). diff -r 79fe96966ca0 -r f2cd320cbf6e src/ChangeLog --- a/src/ChangeLog Wed Nov 19 21:23:19 2003 +0000 +++ b/src/ChangeLog Thu Nov 20 01:48:23 2003 +0000 @@ -1,5 +1,8 @@ 2003-11-19 John W. Eaton + * ls-mat5.cc (read_mat5_binary_element, save_mat5_binary_element): + Handle N-d arrays. + * lex.l (next_token_is_index_op): New function. (handle_close_bracket): Use it.