changeset 4635:f2cd320cbf6e

[project @ 2003-11-20 01:48:23 by jwe]
author jwe
date Thu, 20 Nov 2003 01:48:23 +0000
parents 79fe96966ca0
children fad289f3df73
files liboctave/Array-util.cc liboctave/Array.cc liboctave/ChangeLog liboctave/dim-vector.h src/ChangeLog
diffstat 5 files changed, 130 insertions(+), 115 deletions(-) [+]
line wrap: on
line diff
--- 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<int>& 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;
 }
 
--- 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<LT>::get_size (frozen_len);
-
-	      Array<int> result_idx (lhs_dims.length (), 0);
-	      Array<int> elt_idx;
-
-	      Array<int> 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<LT>::get_size (frozen_len);
+
+	  Array<int> result_idx (lhs_dims.length (), 0);
+	  Array<int> elt_idx;
+
+	  Array<int> 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);
 	    }
 	}
     }
--- 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  <jwe@bevo.che.wisc.edu>
 
+	* dim-vector.h (dim_vector::num_ones): New function.
+	* Array.cc (maybe_delete_elements): Use it instead of
+	num_ones (const Array<int>&).
+
+	* 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.
--- 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).
--- 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  <jwe@bevo.che.wisc.edu>
 
+	* 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.