[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: |
Thu, 26 Jun 2008 17:15:35 +0200 |
User-agent: |
Thunderbird 2.0.0.12 (X11/20080306) |
consider the attached changeset instead.
--
David Bateman address@hidden
Motorola Labs - Paris +33 1 69 35 48 04 (Ph)
Parc Les Algorithmes, Commune de St Aubin +33 6 72 01 06 33 (Mob)
91193 Gif-Sur-Yvette FRANCE +33 1 69 35 77 01 (Fax)
The information contained in this communication has been classified as:
[x] General Business Information
[ ] Motorola Internal Use Only
[ ] Motorola Confidential Proprietary
# HG changeset patch
# User David Bateman <address@hidden>
# Date 1214493236 -7200
# Node ID 8907376d97039307c7dee973ab5d4f6bb09048a2
# Parent 191d10e982d62fb9b218a00289b715cbe82d8e7a
new octave_value constructor for ArrayN<octave_idx_type>
diff --git a/src/ChangeLog b/src/ChangeLog
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,22 @@ 2008-06-23 Jaroslav Hajek <address@hidden
+2008-06-26 David Bateman <address@hidden>
+
+ * ov.cc (octave_value::octave_value const ArrayN<octave_idx_type>,
+ bool)): New constructor
+ * ov.h (octave_value const ArrayN<octave_idx_type>, bool)): Declare it.
+ * DLD-FUNCTIONS/lookup.cc (assign): Delete.
+ (Flookup): Use new octave_value constructors rather than assign.
+ * data.cc (Fsort): Use new octave_value 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 octave_value constructors.
+ * max.cc (MINMAX_SPARSE_BODY, MINMAX_INT_BODY, MINMAX_SINGLE_BODY,
+ MINMAX_DOUBLE_BODY): Use new octave_value constructors.
+
+2008-06-25 David Bateman <address@hidden>
+
+ * pr-output.cc (Frats): Print usage if nargin == 0.
+
2008-06-23 Jaroslav Hajek <address@hidden>
* genprops.awk (emit_source): Avoid gensub for portability.
@@ -70,10 +89,6 @@ 2008-06-11 John W. Eaton <address@hidden
* error.cc (verror): Restore newline in msg_string. Stripping
"error: " prefix when buffering error messages is no longer neeed.
-2008-06-25 David Bateman <address@hidden>
-
- * pr-output.cc (Frats): Print usage if nargin == 0.
-
2008-06-10 John W. Eaton <address@hidden>
* mexproto.h (mxCreateLogicalScalar): Declar arg as mxLogical, not int.
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) = 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) = 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) = 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) = 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) = 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) = 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) = 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) = 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) = 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) = 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) = 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) = 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) = 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) = octave_value (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) = octave_value (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) = octave_value (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) = octave_value (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) = octave_value (sidx, true);
}
else
retval(0) = arg.sort (dim, smode);
diff --git a/src/ov.cc b/src/ov.cc
--- a/src/ov.cc
+++ b/src/ov.cc
@@ -563,6 +563,94 @@ octave_value::octave_value (const ArrayN
octave_value::octave_value (const ArrayN<float>& a)
: rep (new octave_float_matrix (a))
{
+ maybe_mutate ();
+}
+
+octave_value::octave_value (const ArrayN<octave_idx_type>& a, bool zero_based,
+ bool negative_to_nan)
+{
+ NDArray tmp (a.dims ());
+ const octave_idx_type *pa = a.fortran_vec ();
+ double *ptmp = tmp.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]);
+ }
+ rep = new octave_matrix (tmp);
+ maybe_mutate ();
+}
+
+octave_value::octave_value (const Array<octave_idx_type>& a, bool zero_based,
+ bool negative_to_nan)
+{
+ NDArray tmp (a.dims ());
+ const octave_idx_type *pa = a.fortran_vec ();
+ double *ptmp = tmp.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]);
+ }
+ rep = new octave_matrix (tmp);
maybe_mutate ();
}
diff --git a/src/ov.h b/src/ov.h
--- a/src/ov.h
+++ b/src/ov.h
@@ -187,6 +187,10 @@ public:
octave_value (const FloatNDArray& nda);
octave_value (const ArrayN<double>& m);
octave_value (const ArrayN<float>& m);
+ octave_value (const ArrayN<octave_idx_type>& m, bool zero_based = false,
+ bool negative_to_nan = false);
+ octave_value (const Array<octave_idx_type>& m, bool zero_based = false,
+ bool negative_to_nan = false);
octave_value (const DiagMatrix& d);
octave_value (const FloatDiagMatrix& d);
octave_value (const RowVector& v);