diff liboctave/intNDArray.cc @ 8751:9f7ce4bf7650

optimize min/max functions
author Jaroslav Hajek <highegg@gmail.com>
date Mon, 16 Feb 2009 08:52:00 +0100
parents 1bd918cfb6e2
children 724c0f46d9d4
line wrap: on
line diff
--- a/liboctave/intNDArray.cc
+++ b/liboctave/intNDArray.cc
@@ -213,140 +213,28 @@
 intNDArray<T>
 intNDArray<T>::max (int dim) const
 {
-  ArrayN<octave_idx_type> dummy_idx;
-  return max (dummy_idx, dim);
+  return do_mx_minmax_op<intNDArray<T> > (*this, dim, mx_inline_max);
 }
 
 template <class T>
 intNDArray<T>
 intNDArray<T>::max (ArrayN<octave_idx_type>& idx_arg, int dim) const
 {
-  dim_vector dv = this->dims ();
-  dim_vector dr = this->dims ();
-
-  if (dv.numel () == 0 || dim > dv.length () || dim < 0)
-    return intNDArray<T> ();
-  
-  dr(dim) = 1;
-
-  intNDArray<T> result (dr);
-  idx_arg.resize (dr);
-
-  octave_idx_type x_stride = 1;
-  octave_idx_type x_len = dv(dim);
-  for (int i = 0; i < dim; i++)
-    x_stride *= dv(i);
-
-  for (octave_idx_type i = 0; i < dr.numel (); i++)
-    {
-      octave_idx_type x_offset;
-      if (x_stride == 1)
-	x_offset = i * x_len;
-      else
-	{
-	  octave_idx_type x_offset2 = 0;
-	  x_offset = i;
-	  while (x_offset >= x_stride)
-	    {
-	      x_offset -= x_stride;
-	      x_offset2++;
-	    }
-	  x_offset += x_offset2 * x_stride * x_len;
-	}
-
-      octave_idx_type idx_j = 0;
-
-      T tmp_max = this->elem (x_offset);
-
-      for (octave_idx_type j = 1; j < x_len; j++)
-	{
-	  T tmp = this->elem (j * x_stride + x_offset);
-
-	  if (tmp > tmp_max)
-	    {
-	      idx_j = j;
-	      tmp_max = tmp;
-	    }
-	}
-
-      result.elem (i) = tmp_max;
-      idx_arg.elem (i) = idx_j;
-    }
-
-  result.chop_trailing_singletons ();
-  idx_arg.chop_trailing_singletons ();
-
-  return result;
+  return do_mx_minmax_op<intNDArray<T> > (*this, idx_arg, dim, mx_inline_max);
 }
 
 template <class T>
 intNDArray<T>
 intNDArray<T>::min (int dim) const
 {
-  ArrayN<octave_idx_type> dummy_idx;
-  return min (dummy_idx, dim);
+  return do_mx_minmax_op<intNDArray<T> > (*this, dim, mx_inline_min);
 }
 
 template <class T>
 intNDArray<T>
 intNDArray<T>::min (ArrayN<octave_idx_type>& idx_arg, int dim) const
 {
-  dim_vector dv = this->dims ();
-  dim_vector dr = this->dims ();
-
-  if (dv.numel () == 0 || dim > dv.length () || dim < 0)
-    return intNDArray<T> ();
-  
-  dr(dim) = 1;
-
-  intNDArray<T> result (dr);
-  idx_arg.resize (dr);
-
-  octave_idx_type x_stride = 1;
-  octave_idx_type x_len = dv(dim);
-  for (int i = 0; i < dim; i++)
-    x_stride *= dv(i);
-
-  for (octave_idx_type i = 0; i < dr.numel (); i++)
-    {
-      octave_idx_type x_offset;
-      if (x_stride == 1)
-	x_offset = i * x_len;
-      else
-	{
-	  octave_idx_type x_offset2 = 0;
-	  x_offset = i;
-	  while (x_offset >= x_stride)
-	    {
-	      x_offset -= x_stride;
-	      x_offset2++;
-	    }
-	  x_offset += x_offset2 * x_stride * x_len;
-	}
-
-      octave_idx_type idx_j = 0;
-
-      T tmp_min = this->elem (x_offset);
-
-      for (octave_idx_type j = 1; j < x_len; j++)
-	{
-	  T tmp = this->elem (j * x_stride + x_offset);
-
-	  if (tmp < tmp_min)
-	    {
-	      idx_j = j;
-	      tmp_min = tmp;
-	    }
-	}
-
-      result.elem (i) = tmp_min;
-      idx_arg.elem (i) = idx_j;
-    }
-
-  result.chop_trailing_singletons ();
-  idx_arg.chop_trailing_singletons ();
-
-  return result;
+  return do_mx_minmax_op<intNDArray<T> > (*this, idx_arg, dim, mx_inline_min);
 }
 
 /*