changeset 7919:9d080df0c843

new NDArray constructor for ArrayN<octave_idx_type>
author David Bateman <dbateman@free.fr>
date Mon, 30 Jun 2008 15:51:31 +0200
parents 78eef61f75d5
children e56bb65186f6
files liboctave/ChangeLog liboctave/dNDArray.cc liboctave/dNDArray.h src/ChangeLog src/DLD-FUNCTIONS/besselj.cc src/DLD-FUNCTIONS/lookup.cc src/DLD-FUNCTIONS/max.cc src/data.cc src/ov-bool.h
diffstat 9 files changed, 86 insertions(+), 182 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/ChangeLog	Wed Jul 09 22:35:06 2008 +0200
+++ b/liboctave/ChangeLog	Mon Jun 30 15:51:31 2008 +0200
@@ -1,3 +1,9 @@
+2008-07-10  David Bateman  <dbateman@free.fr>
+
+	* dNDArray.cc (NDArray::NDArray (const Array<octave_idx_type>&,
+	bool, bool)): New constructor.
+	* dNDArray.h: Provide decl.
+
 2008-07-10  Michael Goffioul  <michael.goffioul@gmail.com>
 
 	* lo-specfun.h: Fix typo in erff/erfcf declaration.
--- a/liboctave/dNDArray.cc	Wed Jul 09 22:35:06 2008 +0200
+++ b/liboctave/dNDArray.cc	Mon Jun 30 15:51:31 2008 +0200
@@ -41,6 +41,48 @@
 #if defined (HAVE_FFTW3)
 #include "oct-fftw.h"
 
+NDArray::NDArray (const Array<octave_idx_type>& a, bool zero_based,
+		  bool negative_to_nan)
+{
+  const octave_idx_type *pa = a.fortran_vec ();
+  resize (a.dims ());
+  double *ptmp = fortran_vec ();
+  if (negative_to_nan)
+    {
+      double nan_val = lo_ieee_nan_value ();
+
+      if (zero_based)
+	for (octave_idx_type i = 0; i < a.numel (); i++)
+	  {
+	    double val = static_cast<double> 
+	      (pa[i] + static_cast<octave_idx_type> (1));
+	    if (val <= 0)
+	      ptmp[i] = nan_val;
+	    else
+	      ptmp[i] = val;
+	  }
+      else
+	for (octave_idx_type i = 0; i < a.numel (); i++)
+	  {
+	    double val = static_cast<double> (pa[i]);
+	    if (val <= 0)
+	      ptmp[i] = nan_val;
+	    else
+	      ptmp[i] = val;
+	  }
+    }
+  else
+    {
+      if (zero_based)
+	for (octave_idx_type i = 0; i < a.numel (); i++)
+	  ptmp[i] = static_cast<double> 
+	    (pa[i] + static_cast<octave_idx_type> (1));
+      else
+	for (octave_idx_type i = 0; i < a.numel (); i++)
+	  ptmp[i] = static_cast<double> (pa[i]);
+    }
+}
+
 ComplexNDArray
 NDArray::fourier (int dim) const
 {
--- a/liboctave/dNDArray.h	Wed Jul 09 22:35:06 2008 +0200
+++ b/liboctave/dNDArray.h	Mon Jun 30 15:51:31 2008 +0200
@@ -47,6 +47,9 @@
 
   NDArray (const Matrix& a) : MArrayN<double> (a) { }
 
+  NDArray (const Array<octave_idx_type>& a, bool zero_based = false, 
+	   bool negative_to_nan = false);
+
   template <class U>
   NDArray (const MArrayN<U>& a) : MArrayN<double> (a) { }
 
--- a/src/ChangeLog	Wed Jul 09 22:35:06 2008 +0200
+++ b/src/ChangeLog	Mon Jun 30 15:51:31 2008 +0200
@@ -1,3 +1,17 @@
+2008-07-10  David Bateman  <dbateman@free.fr>
+
+	* DLD-FUNCTIONS/lookup.cc (assign): Delete.
+	(Flookup): Use new NDArray constructors rather than assign.
+	* data.cc (Fsort): Use new NDArray constructors rather than 
+	directly assigning.
+	* besselj.cc (int_array2_to_matrix, int_arrayn_to_array,
+	int_array2_to_float_matrix, int_arrayn_to_float_array): Delete.
+	(do-bessel): Use new NDArray constructors.
+	* max.cc (MINMAX_SPARSE_BODY, MINMAX_INT_BODY, MINMAX_SINGLE_BODY,
+	MINMAX_DOUBLE_BODY): Use new NDArray constructors. 
+	* ov-bool.h (array_value, float_array_value): Explictly cast
+	boolean scalar to double before the assignment to avoid ambiguity.
+
 2008-07-10  David Bateman  <dbateman@free.fr>
 
 	* ls-mat4.cc (read_mat_binary_data, save_mat_binary_data): Add
--- a/src/DLD-FUNCTIONS/besselj.cc	Wed Jul 09 22:35:06 2008 +0200
+++ b/src/DLD-FUNCTIONS/besselj.cc	Mon Jun 30 15:51:31 2008 +0200
@@ -79,80 +79,6 @@
     } \
   while (0)
 
-static inline Matrix
-int_array2_to_matrix (const Array2<octave_idx_type>& a)
-{
-  octave_idx_type nr = a.rows ();
-  octave_idx_type nc = a.cols ();
-
-  Matrix retval (nr, nc);
-
-  for (octave_idx_type j = 0; j < nc; j++)
-    for (octave_idx_type i = 0; i < nr; i++)
-      {
-	OCTAVE_QUIT;
-
-	retval(i,j) = static_cast<double> (a(i,j));
-      }
-
-  return retval;
-}
-
-static inline NDArray
-int_arrayN_to_array (const ArrayN<octave_idx_type>& a)
-{
-  dim_vector dv = a.dims ();
-  int nel = dv.numel ();
-
-  NDArray retval (dv);
-
-  for (int i = 0; i < nel; i++)
-    {
-      OCTAVE_QUIT;
-      
-      retval(i) = static_cast<double> (a(i));
-    }
-
-  return retval;
-}
-
-static inline FloatMatrix
-int_array2_to_float_matrix (const Array2<octave_idx_type>& a)
-{
-  octave_idx_type nr = a.rows ();
-  octave_idx_type nc = a.cols ();
-
-  FloatMatrix retval (nr, nc);
-
-  for (octave_idx_type j = 0; j < nc; j++)
-    for (octave_idx_type i = 0; i < nr; i++)
-      {
-	OCTAVE_QUIT;
-
-	retval(i,j) = static_cast<float> (a(i,j));
-      }
-
-  return retval;
-}
-
-static inline FloatNDArray
-int_arrayN_to_float_array (const ArrayN<octave_idx_type>& a)
-{
-  dim_vector dv = a.dims ();
-  int nel = dv.numel ();
-
-  FloatNDArray retval (dv);
-
-  for (int i = 0; i < nel; i++)
-    {
-      OCTAVE_QUIT;
-      
-      retval(i) = static_cast<float> (a(i));
-    }
-
-  return retval;
-}
-
 static void
 gripe_bessel_arg (const char *fn, const char *arg)
 {
@@ -213,7 +139,7 @@
 			  DO_BESSEL (type, alpha, x, scaled, ierr, result);
 
 			  if (nargout > 1)
-			    retval(1) = int_arrayN_to_float_array (ierr);
+			    retval(1) = NDArray (ierr);
 
 			  retval(0) = result;
 			}
@@ -249,7 +175,7 @@
 			  DO_BESSEL (type, ralpha, cx, scaled, ierr, result);
 
 			  if (nargout > 1)
-			    retval(1) = int_array2_to_float_matrix (ierr);
+			    retval(1) = NDArray (ierr);
 
 			  retval(0) = result;
 			}
@@ -277,7 +203,7 @@
 			      DO_BESSEL (type, alpha, x, scaled, ierr, result);
 
 			      if (nargout > 1)
-				retval(1) = int_arrayN_to_float_array (ierr);
+				retval(1) = NDArray (ierr);
 
 			      retval(0) = result;
 			    }
@@ -296,7 +222,7 @@
 			      DO_BESSEL (type, alpha, x, scaled, ierr, result);
 			  
 			      if (nargout > 1)
-				retval(1) = int_arrayN_to_float_array (ierr);
+				retval(1) = NDArray (ierr);
 
 			      retval(0) = result;
 			    }
@@ -348,7 +274,7 @@
 			  DO_BESSEL (type, alpha, x, scaled, ierr, result);
 
 			  if (nargout > 1)
-			    retval(1) = int_arrayN_to_array (ierr);
+			    retval(1) = NDArray (ierr);
 
 			  retval(0) = result;
 			}
@@ -384,7 +310,7 @@
 			  DO_BESSEL (type, ralpha, cx, scaled, ierr, result);
 
 			  if (nargout > 1)
-			    retval(1) = int_array2_to_matrix (ierr);
+			    retval(1) = NDArray (ierr);
 
 			  retval(0) = result;
 			}
@@ -412,7 +338,7 @@
 			      DO_BESSEL (type, alpha, x, scaled, ierr, result);
 
 			      if (nargout > 1)
-				retval(1) = int_arrayN_to_array (ierr);
+				retval(1) = NDArray (ierr);
 
 			      retval(0) = result;
 			    }
@@ -431,7 +357,7 @@
 			      DO_BESSEL (type, alpha, x, scaled, ierr, result);
 			  
 			      if (nargout > 1)
-				retval(1) = int_arrayN_to_array (ierr);
+				retval(1) = NDArray (ierr);
 
 			      retval(0) = result;
 			    }
@@ -666,7 +592,7 @@
 		    result = airy (z, kind == 1, scale, ierr);
 
 		  if (nargout > 1)
-		    retval(1) = int_arrayN_to_float_array (ierr);
+		    retval(1) = NDArray (ierr);
 
 		  retval(0) = result;
 		}
@@ -688,7 +614,7 @@
 		    result = airy (z, kind == 1, scale, ierr);
 
 		  if (nargout > 1)
-		    retval(1) = int_arrayN_to_array (ierr);
+		    retval(1) = NDArray (ierr);
 
 		  retval(0) = result;
 		}
--- a/src/DLD-FUNCTIONS/lookup.cc	Wed Jul 09 22:35:06 2008 +0200
+++ b/src/DLD-FUNCTIONS/lookup.cc	Mon Jun 30 15:51:31 2008 +0200
@@ -49,25 +49,6 @@
 	  || str.find (std::toupper (c)) != std::string::npos);
 }
 
-// FIXME -- remove these one once octave_value supports octave_idx_type.
-static octave_value&
-assign (octave_value& ov, octave_idx_type idx)
-{
-  double tmp = idx;
-  ov = tmp;
-  return ov;
-}
-
-static octave_value&
-assign (octave_value& ov, const ArrayN<octave_idx_type>& ida)
-{
-  NDArray tmp (ida.dims ());
-  for (int i = 0; i < ida.numel (); i++)
-    tmp(i) = ida(i);
-  ov = tmp;
-  return ov;
-}
-
 // normal ascending comparator
 static bool
 ov_str_less (const octave_value& a, const octave_value& b)
@@ -239,8 +220,7 @@
 			std::less<double> ());
 	}
 
-      //retval(0) = idx;
-      assign (retval(0), idx);
+      retval(0) = NDArray (idx);
     }
   else if (str_case)
     {
@@ -288,8 +268,7 @@
                   idx(i) = bin_lookup (table.data (), table.length (), y(i), 
                                        std::ptr_fun (ov_str_comp));
 
-              //retval(0) = idx;
-              assign (retval(0), idx);
+              retval(0) = NDArray (idx);
             }
           else
             {
@@ -298,8 +277,7 @@
               idx = bin_lookup (table.data (), table.length (), argy, 
                                 std::ptr_fun (ov_str_comp));
 
-              //retval(0) = idx;
-              assign (retval(0), idx);
+              retval(0) = static_cast<double> (idx);
             }
         }
       else
--- a/src/DLD-FUNCTIONS/max.cc	Wed Jul 09 22:35:06 2008 +0200
+++ b/src/DLD-FUNCTIONS/max.cc	Mon Jun 30 15:51:31 2008 +0200
@@ -100,21 +100,7 @@
       octave_idx_type len = index.numel (); \
  \
       if (len > 0) \
-	{ \
-	  double nan_val = lo_ieee_nan_value (); \
- \
-	  NDArray idx (index.dims ()); \
- \
-	  for (octave_idx_type i = 0; i < len; i++) \
-	    { \
-	      OCTAVE_QUIT; \
-	      octave_idx_type tmp = index.elem (i) + 1; \
-	      idx.elem (i) = (tmp <= 0) \
-		? nan_val : static_cast<double> (tmp); \
-	    } \
- \
-	  retval(1) = idx; \
-	} \
+	retval(1) = NDArray (index, true, true);	\
       else \
 	retval(1) = NDArray (); \
     } \
@@ -276,23 +262,9 @@
       octave_idx_type len = index.numel (); \
  \
       if (len > 0) \
-	{ \
-	  float nan_val = lo_ieee_nan_value (); \
- \
-	  FloatNDArray idx (index.dims ()); \
- \
-	  for (octave_idx_type i = 0; i < len; i++) \
-	    { \
-	      OCTAVE_QUIT; \
-	      octave_idx_type tmp = index.elem (i) + 1; \
-	      idx.elem (i) = (tmp <= 0) \
-		? nan_val : static_cast<float> (tmp); \
-	    } \
- \
-	  retval(1) = idx; \
-	} \
+	retval(1) = NDArray (index, true, true);	\
       else \
-	retval(1) = FloatNDArray (); \
+	retval(1) = NDArray (); \
     } \
   else \
     { \
@@ -423,21 +395,7 @@
       octave_idx_type len = index.numel (); \
  \
       if (len > 0) \
-	{ \
-	  double nan_val = lo_ieee_nan_value (); \
- \
-	  NDArray idx (index.dims ()); \
- \
-	  for (octave_idx_type i = 0; i < len; i++) \
-	    { \
-	      OCTAVE_QUIT; \
-	      octave_idx_type tmp = index.elem (i) + 1; \
-	      idx.elem (i) = (tmp <= 0) \
-		? nan_val : static_cast<double> (tmp); \
-	    } \
- \
-	  retval(1) = idx; \
-	} \
+	retval(1) = NDArray (index, true, true);	\
       else \
 	retval(1) = NDArray (); \
     } \
@@ -518,21 +476,7 @@
       octave_idx_type len = index.numel (); \
  \
       if (len > 0) \
-	{ \
-	  double nan_val = lo_ieee_nan_value (); \
- \
-	  NDArray idx (index.dims ()); \
- \
-	  for (octave_idx_type i = 0; i < len; i++) \
-	    { \
-	      OCTAVE_QUIT; \
-	      octave_idx_type tmp = index.elem (i) + 1; \
-	      idx.elem (i) = (tmp <= 0) \
-		? nan_val : static_cast<double> (tmp); \
-	    } \
- \
-	  retval(1) = idx; \
-	} \
+	retval(1) = NDArray (index, true, true);	\
       else \
 	retval(1) = NDArray (); \
     } \
--- a/src/data.cc	Wed Jul 09 22:35:06 2008 +0200
+++ b/src/data.cc	Mon Jun 30 15:51:31 2008 +0200
@@ -5248,16 +5248,7 @@
       Array<octave_idx_type> sidx;
 
       retval (0) = arg.sort (sidx, dim, smode);
-
-      octave_idx_type *ps = sidx.fortran_vec ();
-      NDArray midx (sidx.dims ());
-      double *pm = midx.fortran_vec ();
-
-      for (octave_idx_type i = 0; i < sidx.numel (); i++)
-	pm [i] = static_cast<double> 
-	  (ps [i] + static_cast<octave_idx_type> (1));
-
-      retval (1) = midx;
+      retval (1) = NDArray (sidx, true);
     }
   else
     retval(0) = arg.sort (dim, smode);
--- a/src/ov-bool.h	Wed Jul 09 22:35:06 2008 +0200
+++ b/src/ov-bool.h	Mon Jun 30 15:51:31 2008 +0200
@@ -134,10 +134,10 @@
     { return FloatMatrix (1, 1, scalar); }
 
   NDArray array_value (bool = false) const
-    { return NDArray (dim_vector (1, 1), scalar); }
+    { return NDArray (dim_vector (1, 1), static_cast<double> (scalar)); }
 
   FloatNDArray float_array_value (bool = false) const
-    { return FloatNDArray (dim_vector (1, 1), scalar); }
+    { return FloatNDArray (dim_vector (1, 1), static_cast<double> (scalar)); }
 
   Complex complex_value (bool = false) const { return scalar; }