diff src/ov-struct.cc @ 10753:bee1b1a2e29a

yield compatible dims from cell2struct + more fixes. build & tests OK
author Jaroslav Hajek <highegg@gmail.com>
date Fri, 25 Jun 2010 09:50:55 +0200
parents 717ba2c3eef1
children 92eb5fb58ebc
line wrap: on
line diff
--- a/src/ov-struct.cc
+++ b/src/ov-struct.cc
@@ -1418,7 +1418,7 @@
   bool success = true;
   octave_idx_type len = 0;
 
-  if (extract_keyword (is, "length", len, true) && len >= 0)
+  if (extract_keyword (is, "length", len) && len >= 0)
     {
       if (len > 0)
         {
@@ -2043,14 +2043,31 @@
 
           if (! error_state)
             {
-              octave_map map;
-              Array<idx_vector> ia (std::max (dim+1, vals.ndims ()), 1, 
-                                    idx_vector::colon);
+              int nd = std::max (dim+1, vals.ndims ());
+              // result dimensions.
+              dim_vector rdv = vals.dims ().redim (nd);
+
+              assert (ext == rdv(dim));
+              if (nd == 2)
+                {
+                  rdv(0) = rdv(1-dim);
+                  rdv(1) = 1;
+                }
+              else
+                {
+                  for (int i =  dim + 1; i < nd; i++)
+                    rdv(i-1) = rdv(i);
+
+                  rdv.resize (nd-1);
+                }
+
+              octave_map map (rdv);
+              Array<idx_vector> ia (nd, 1, idx_vector::colon);
 
               for (octave_idx_type i = 0; i < ext; i++)
                 {
                   ia(dim) = i;
-                  map.setfield (fields(i), vals.index (ia));
+                  map.setfield (fields(i), vals.index (ia).reshape (rdv));
                 }
 
               retval = map;