diff liboctave/Array.cc @ 8651:ea8e65ca234f

reduce memory usage in sorting
author Jaroslav Hajek <highegg@gmail.com>
date Tue, 03 Feb 2009 08:16:39 +0100
parents 188d38a553c7
children 314be237cd5b
line wrap: on
line diff
--- a/liboctave/Array.cc
+++ b/liboctave/Array.cc
@@ -1991,23 +1991,23 @@
 
 template <class T>
 bool 
-ascending_compare (vec_index<T> *a, vec_index<T> *b)
+ascending_compare (const T *a, const T *b)
 {
-  return (a->vec < b->vec);
+  return (*a < *b);
 }
 
 template <class T>
 bool 
-descending_compare (vec_index<T> *a, vec_index<T> *b)
+descending_compare (const T *a, const T *b)
 {
-  return (a->vec > b->vec);
+  return (*a > *b);
 }
 
 template <class T>
 Array<T>
 Array<T>::sort (octave_idx_type dim, sortmode mode) const
 {
-  Array<T> m = *this;
+  Array<T> m (dims ());
 
   dim_vector dv = m.dims ();
 
@@ -2022,6 +2022,8 @@
     stride *= dv(i);
 
   T *v = m.fortran_vec ();
+  const T *ov = data ();
+
   octave_sort<T> lsort;
   
   if (mode == ASCENDING) 
@@ -2035,8 +2037,10 @@
     {
       for (octave_idx_type j = 0; j < iter; j++)
 	{
+          std::copy (ov, ov + ns, v);
 	  lsort.sort (v, ns);
 	  v += ns;
+          ov += ns;
 	}
     }
   else
@@ -2057,7 +2061,7 @@
 	  offset += offset2 * stride * ns;
 	  
 	  for (octave_idx_type i = 0; i < ns; i++)
-	    pvi[i] = v[i*stride + offset];
+	    pvi[i] = ov[i*stride + offset];
 
 	  lsort.sort (pvi, ns);
 	      
@@ -2074,7 +2078,7 @@
 Array<T>::sort (Array<octave_idx_type> &sidx, octave_idx_type dim, 
 		sortmode mode) const
 {
-  Array<T> m = *this;
+  Array<T> m (dims ());
 
   dim_vector dv = m.dims ();
 
@@ -2092,7 +2096,9 @@
     stride *= dv(i);
 
   T *v = m.fortran_vec ();
-  octave_sort<vec_index<T> *> indexed_sort;
+  const T *ov = data ();
+
+  octave_sort<const T *> indexed_sort;
 
   if (mode == ASCENDING) 
     indexed_sort.set_compare (ascending_compare);
@@ -2101,11 +2107,7 @@
   else
     abort ();
 
-  OCTAVE_LOCAL_BUFFER (vec_index<T> *, vi, ns);
-  OCTAVE_LOCAL_BUFFER (vec_index<T>, vix, ns);
-
-  for (octave_idx_type i = 0; i < ns; i++)
-    vi[i] = &vix[i];
+  OCTAVE_LOCAL_BUFFER (const T *, vi, ns);
 
   sidx = Array<octave_idx_type> (dv);
       
@@ -2116,23 +2118,23 @@
 	   octave_idx_type offset = j * ns;
 
 	  for (octave_idx_type i = 0; i < ns; i++)
-	    {
-	      vi[i]->vec = v[i];
-	      vi[i]->indx = i;
-	    }
+            vi[i] = ov + i;
 
 	  indexed_sort.sort (vi, ns);
 
 	  for (octave_idx_type i = 0; i < ns; i++)
 	    {
-	      v[i] = vi[i]->vec;
-	      sidx(i + offset) = vi[i]->indx;
+	      v[i] = *vi[i];
+	      sidx(i + offset) = vi[i] - ov;
 	    }
 	  v += ns;
+          ov += ns;
 	}
     }
   else
     {
+      OCTAVE_LOCAL_BUFFER (T, vix, ns);
+
       for (octave_idx_type j = 0; j < iter; j++)
 	{
 	  octave_idx_type offset = j;
@@ -2148,16 +2150,16 @@
 	      
 	  for (octave_idx_type i = 0; i < ns; i++)
 	    {
-	      vi[i]->vec = v[i*stride + offset];
-	      vi[i]->indx = i;
+	      vix[i] = ov[i*stride + offset];
+	      vi[i] = vix + i;
 	    }
 
 	  indexed_sort.sort (vi, ns);
 	      
 	  for (octave_idx_type i = 0; i < ns; i++)
 	    {
-	      v[i*stride+offset] = vi[i]->vec;
-	      sidx(i*stride+offset) = vi[i]->indx;
+	      v[i*stride+offset] = *vi[i];
+	      sidx(i*stride+offset) = vi[i] - vix;
 	    }
 	}
     }
@@ -2170,11 +2172,11 @@
 template <>
 bool ascending_compare (double, double);
 template <>
-bool ascending_compare (vec_index<double>*, vec_index<double>*);
+bool ascending_compare (const double*, const double*);
 template <>
 bool descending_compare (double, double);
 template <>
-bool descending_compare (vec_index<double>*, vec_index<double>*);
+bool descending_compare (const double*, const double*);
 
 template <>
 Array<double> Array<double>::sort (octave_idx_type dim, sortmode mode) const;