# HG changeset patch # User David Bateman # Date 1214833891 -7200 # Node ID 9d080df0c84355b8ecaef4eef3b27308d9daf20b # Parent 78eef61f75d5a9485276b7b114aa94524d31ee42 new NDArray constructor for ArrayN diff -r 78eef61f75d5 -r 9d080df0c843 liboctave/ChangeLog --- 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 + + * dNDArray.cc (NDArray::NDArray (const Array&, + bool, bool)): New constructor. + * dNDArray.h: Provide decl. + 2008-07-10 Michael Goffioul * lo-specfun.h: Fix typo in erff/erfcf declaration. diff -r 78eef61f75d5 -r 9d080df0c843 liboctave/dNDArray.cc --- 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& 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 + (pa[i] + static_cast (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 (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 + (pa[i] + static_cast (1)); + else + for (octave_idx_type i = 0; i < a.numel (); i++) + ptmp[i] = static_cast (pa[i]); + } +} + ComplexNDArray NDArray::fourier (int dim) const { diff -r 78eef61f75d5 -r 9d080df0c843 liboctave/dNDArray.h --- 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 (a) { } + NDArray (const Array& a, bool zero_based = false, + bool negative_to_nan = false); + template NDArray (const MArrayN& a) : MArrayN (a) { } diff -r 78eef61f75d5 -r 9d080df0c843 src/ChangeLog --- 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 + + * 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 * ls-mat4.cc (read_mat_binary_data, save_mat_binary_data): Add diff -r 78eef61f75d5 -r 9d080df0c843 src/DLD-FUNCTIONS/besselj.cc --- 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& 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 (a(i,j)); - } - - return retval; -} - -static inline NDArray -int_arrayN_to_array (const ArrayN& 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 (a(i)); - } - - return retval; -} - -static inline FloatMatrix -int_array2_to_float_matrix (const Array2& 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 (a(i,j)); - } - - return retval; -} - -static inline FloatNDArray -int_arrayN_to_float_array (const ArrayN& 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 (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; } diff -r 78eef61f75d5 -r 9d080df0c843 src/DLD-FUNCTIONS/lookup.cc --- 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& 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 ()); } - //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 (idx); } } else diff -r 78eef61f75d5 -r 9d080df0c843 src/DLD-FUNCTIONS/max.cc --- 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 (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 (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 (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 (tmp); \ - } \ - \ - retval(1) = idx; \ - } \ + retval(1) = NDArray (index, true, true); \ else \ retval(1) = NDArray (); \ } \ diff -r 78eef61f75d5 -r 9d080df0c843 src/data.cc --- 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 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 - (ps [i] + static_cast (1)); - - retval (1) = midx; + retval (1) = NDArray (sidx, true); } else retval(0) = arg.sort (dim, smode); diff -r 78eef61f75d5 -r 9d080df0c843 src/ov-bool.h --- 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 (scalar)); } FloatNDArray float_array_value (bool = false) const - { return FloatNDArray (dim_vector (1, 1), scalar); } + { return FloatNDArray (dim_vector (1, 1), static_cast (scalar)); } Complex complex_value (bool = false) const { return scalar; }