octave-maintainers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Changeset]: octave_value(const ArrayN<octave_idx_type>&) constructo


From: David Bateman
Subject: Re: [Changeset]: octave_value(const ArrayN<octave_idx_type>&) constructor
Date: Mon, 30 Jun 2008 15:54:28 +0200
User-agent: Thunderbird 1.5.0.7 (Windows/20060909)

John W. Eaton wrote:
On 26-Jun-2008, David Bateman wrote:

| consider the attached changeset instead.

It seems odd to me that the octave_value constructor that takes an
Array<octave_idx_type> value would convert it to NDArray internally
instead of storing it as an Array<octave_idx_type>.  The other
conversions also seem odd, but I guess we already have a few other
constructors that have similar options.  What about defining
Array<octave_idx_type> to NDArray conversion with the options and then
using the existing octave_value (const NDArray&) constructor instead?
It seems to me that this approach might cause less trouble later if we
decided we wanted an actual Array<octave_idx_type> value in the
octave_value hierarchy.

jwe
Ok, then here is take 3.

D.

# HG changeset patch
# User David Bateman <address@hidden>
# Date 1214833891 -7200
# Node ID 2d683d51aa719e46d28aa93d7c9138acd6a48004
# Parent  9c14d5226c0b89bd7dc3daf6ac38bf57d203f6ce
new NDArray constructor for ArrayN<octave_idx_type>

diff --git a/liboctave/ChangeLog b/liboctave/ChangeLog
--- a/liboctave/ChangeLog
+++ b/liboctave/ChangeLog
@@ -1,3 +1,12 @@ 2008-06-20  Jaroslav Hajek <address@hidden
+2008-06-30  David Bateman  <address@hidden>
+
+       * dNDArray.cc (NDArray::NDArray (const ArrayN<octave_idx_type>&,
+       bool, bool), NDArray::NDArray (const Array<octave_idx_type>&,
+       bool, bool)): New constructors.
+       * dNDArray.h (NDArray::NDArray (const ArrayN<octave_idx_type>&,
+       bool, bool), NDArray::NDArray (const Array<octave_idx_type>&,
+       bool, bool)): Declare them.
+
 2008-06-20  Jaroslav Hajek <address@hidden>
 
        * MatrixType.h: Add missing include statement.
diff --git a/liboctave/dNDArray.cc b/liboctave/dNDArray.cc
--- a/liboctave/dNDArray.cc
+++ b/liboctave/dNDArray.cc
@@ -40,6 +40,90 @@ along with Octave; see the file COPYING.
 
 #if defined (HAVE_FFTW3)
 #include "oct-fftw.h"
+
+NDArray::NDArray (const ArrayN<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]);
+    }
+}
+
+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
diff --git a/liboctave/dNDArray.h b/liboctave/dNDArray.h
--- a/liboctave/dNDArray.h
+++ b/liboctave/dNDArray.h
@@ -46,6 +46,12 @@ public:
   NDArray (const NDArray& a) : MArrayN<double> (a) { }
 
   NDArray (const Matrix& a) : MArrayN<double> (a) { }
+
+  NDArray (const ArrayN<octave_idx_type>& a, bool zero_based = false, 
+          bool negative_to_nan = false);
+
+  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) { }
diff --git a/src/ChangeLog b/src/ChangeLog
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,17 @@ 2008-06-25  David Bateman  <address@hidden
+2008-06-26  David Bateman  <address@hidden>
+
+       * 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): explict cast
+       boolean scalar to double before the assignment to avoid ambiguity.
+
 2008-06-25  David Bateman  <address@hidden>
 
        * pr-output.cc (Frats): Print usage if nargin == 0.
diff --git a/src/DLD-FUNCTIONS/besselj.cc b/src/DLD-FUNCTIONS/besselj.cc
--- a/src/DLD-FUNCTIONS/besselj.cc
+++ b/src/DLD-FUNCTIONS/besselj.cc
@@ -79,80 +79,6 @@ enum bessel_type
     } \
   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 (enum bessel_type type, const 
                          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 (enum bessel_type type, const 
                          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 (enum bessel_type type, const 
                              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 (enum bessel_type type, const 
                              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 (enum bessel_type type, const 
                          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 (enum bessel_type type, const 
                          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 (enum bessel_type type, const 
                              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 (enum bessel_type type, const 
                              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 @@ return @code{NaN}.\n\
                    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 @@ return @code{NaN}.\n\
                    result = airy (z, kind == 1, scale, ierr);
 
                  if (nargout > 1)
-                   retval(1) = int_arrayN_to_array (ierr);
+                   retval(1) = NDArray (ierr);
 
                  retval(0) = result;
                }
diff --git a/src/DLD-FUNCTIONS/lookup.cc b/src/DLD-FUNCTIONS/lookup.cc
--- a/src/DLD-FUNCTIONS/lookup.cc
+++ b/src/DLD-FUNCTIONS/lookup.cc
@@ -47,25 +47,6 @@ contains_char (const std::string& str, c
 {
   return (str.find (c) != std::string::npos 
          || 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
@@ -239,8 +220,7 @@ For string lookup, 'i' indicates case-in
                        std::less<double> ());
        }
 
-      //retval(0) = idx;
-      assign (retval(0), idx);
+      retval(0) = NDArray (idx);
     }
   else if (str_case)
     {
@@ -288,8 +268,7 @@ For string lookup, 'i' indicates case-in
                   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 @@ For string lookup, 'i' indicates case-in
               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
diff --git a/src/DLD-FUNCTIONS/max.cc b/src/DLD-FUNCTIONS/max.cc
--- a/src/DLD-FUNCTIONS/max.cc
+++ b/src/DLD-FUNCTIONS/max.cc
@@ -100,21 +100,7 @@ along with Octave; see the file COPYING.
       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 @@ along with Octave; see the file COPYING.
       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; \
-       } \
-      else \
-       retval(1) = FloatNDArray (); \
+       retval(1) = NDArray (index, true, true);        \
+      else \
+       retval(1) = NDArray (); \
     } \
   else \
     { \
@@ -423,21 +395,7 @@ along with Octave; see the file COPYING.
       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 @@ along with Octave; see the file COPYING.
       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 (); \
     } \
diff --git a/src/data.cc b/src/data.cc
--- a/src/data.cc
+++ b/src/data.cc
@@ -5250,16 +5250,7 @@ ordered lists.\n\
       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);
diff --git a/src/ov-bool.h b/src/ov-bool.h
--- a/src/ov-bool.h
+++ b/src/ov-bool.h
@@ -134,10 +134,10 @@ public:
     { 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; }
 

reply via email to

[Prev in Thread] Current Thread [Next in Thread]