diff liboctave/Array.cc @ 7646:ad16ea379d2f

additional fixes for Array::assignN
author David Bateman <dbateman@free.fr>
date Wed, 26 Mar 2008 15:38:25 -0400
parents 9a4541c622b5
children ff918ee1a983
line wrap: on
line diff
--- a/liboctave/Array.cc
+++ b/liboctave/Array.cc
@@ -3365,18 +3365,22 @@
 	    {
 	      int ncolon = 0;
 	      int fcolon = 0;
-	      int lcolon = 0;
+	      octave_idx_type new_dims_numel = 1;
+	      int new_dims_vec = 0;
 	      for (int i = 0; i < n_idx; i++)
 		if (idx(i).is_colon ())
 		  {
 		    ncolon ++;
 		    if (ncolon == 1)
 		      fcolon = i;
-		    lcolon = i;
-		    new_dims (i) = 1;
 		  } 
 		else
-		  new_dims (i) = idx(i).capacity ();
+		  {
+		    octave_idx_type cap = idx(i).capacity ();
+		    new_dims_numel *= cap;
+		    if (cap != 1)
+		      new_dims_vec ++;
+		  }
 
 	      if (ncolon == n_idx)
 		{
@@ -3387,9 +3391,7 @@
 		}
 	      else
 		{
-		  octave_idx_type new_dims_numel = new_dims.numel ();
 		  octave_idx_type rhs_dims_numel = rhs_dims.numel ();
-		  bool is_vec = is_vector (new_dims);
 	      	      
 		  for (int i = 0; i < n_idx; i++)
 		    new_dims(i) = idx(i).orig_empty () ? 0 : idx(i).max () + 1;
@@ -3397,13 +3399,17 @@
 		  if (new_dims_numel != rhs_dims_numel && 
 		      ncolon > 0 && new_dims_numel == 1)
 		    {
-		      if (ncolon == 2 && rhs_dims_len == 2 && 
-			  rhs_dims(0) == 1)
-			new_dims (lcolon) = rhs_dims_numel;
+		      if (ncolon == rhs_dims_len)
+			{
+			  int k = 0;
+			  for (int i = 0; i < n_idx; i++)
+			    if (idx(i).is_colon ())
+			      new_dims (i) = rhs_dims (k++);
+			}
 		      else
 			new_dims (fcolon) = rhs_dims_numel;
 		    }
-		  else if (new_dims_numel != rhs_dims_numel || !is_vec)
+		  else if (new_dims_numel != rhs_dims_numel || new_dims_vec > 1)
 		    {
 		      (*current_liboctave_error_handler)
 			("A(IDX-LIST) = RHS: mismatched index and RHS dimension");