# HG changeset patch # User jwe # Date 1090526286 0 # Node ID 14027e0bafa448f6c774e5272f104e9ee41c71a2 # Parent 1242acab4246452d1c8eb486f7170077d57212d6 [project @ 2004-07-22 19:58:06 by jwe] diff -r 1242acab4246 -r 14027e0bafa4 liboctave/ChangeLog --- a/liboctave/ChangeLog Mon Jul 12 17:14:13 2004 +0000 +++ b/liboctave/ChangeLog Thu Jul 22 19:58:06 2004 +0000 @@ -1,3 +1,11 @@ +2004-07-22 David Bateman + + * oct-sort.h: Don't include oct-obj.h. + + * lo-specfun.cc (is_integer_value): New function. + (zbesj, zbesi, zbesy): Special case negative integer or half + integer orders that cause overflow for small arguments. + 2004-07-12 John W. Eaton * oct-inttypes.h (octave_int::nbits): New function. diff -r 1242acab4246 -r 14027e0bafa4 liboctave/lo-specfun.cc --- a/liboctave/lo-specfun.cc Mon Jul 12 17:14:13 2004 +0000 +++ b/liboctave/lo-specfun.cc Thu Jul 22 19:58:06 2004 +0000 @@ -223,6 +223,12 @@ return retval; } +static inline bool +is_integer_value (double x) +{ + return x == static_cast (static_cast (x)); +} + static inline Complex zbesj (const Complex& z, double alpha, int kode, int& ierr) { @@ -252,6 +258,15 @@ retval = bessel_return_value (Complex (yr, yi), ierr); } + else if (is_integer_value (alpha)) + { + // zbesy can overflow as z->0, and cause troubles for generic case below + alpha = -alpha; + Complex tmp = zbesj (z, alpha, kode, ierr); + if ((static_cast (alpha)) & 1) + tmp = - tmp; + retval = bessel_return_value (tmp, ierr); + } else { alpha = -alpha; @@ -313,6 +328,15 @@ return bessel_return_value (Complex (yr, yi), ierr); } + else if (is_integer_value (alpha - 0.5)) + { + // zbesy can overflow as z->0, and cause troubles for generic case below + alpha = -alpha; + Complex tmp = zbesj (z, alpha, kode, ierr); + if ((static_cast (alpha - 0.5)) & 1) + tmp = - tmp; + retval = bessel_return_value (tmp, ierr); + } else { alpha = -alpha; @@ -369,8 +393,9 @@ if (ierr == 0 || ierr == 3) { - tmp += (2.0 / M_PI) * sin (M_PI * alpha) - * zbesk (z, alpha, kode, ierr); + if (! is_integer_value (alpha - 0.5)) + tmp += (2.0 / M_PI) * sin (M_PI * alpha) + * zbesk (z, alpha, kode, ierr); retval = bessel_return_value (tmp, ierr); } diff -r 1242acab4246 -r 14027e0bafa4 liboctave/oct-sort.h --- a/liboctave/oct-sort.h Mon Jul 12 17:14:13 2004 +0000 +++ b/liboctave/oct-sort.h Thu Jul 22 19:58:06 2004 +0000 @@ -86,7 +86,6 @@ #include #endif -#include "oct-obj.h" #include "lo-mappers.h" #include "quit.h" diff -r 1242acab4246 -r 14027e0bafa4 scripts/ChangeLog --- a/scripts/ChangeLog Mon Jul 12 17:14:13 2004 +0000 +++ b/scripts/ChangeLog Thu Jul 22 19:58:06 2004 +0000 @@ -1,3 +1,22 @@ +2004-07-22 Etienne Grossmann + + * general/sub2ind.m: Make reshaping index list unnecessary. + +2004-07-22 Paul Kienzle + + * miscellaneous/unix.m: Fix doc string. + +2004-07-22 Stefan van der Walt + + * plot/figure.m: Clarification of documentation. + + * image/imshow.m: Warn for complex images. + Only estimate colourmap for images in [0, 65536]. + +2004-07-22 David Bateman + + * general/num2str.m: Fix the case of an all zero input. + 2004-06-22 Etienne Grossmann * general/ind2sub.m: Doc fix. diff -r 1242acab4246 -r 14027e0bafa4 scripts/general/num2str.m --- a/scripts/general/num2str.m Mon Jul 12 17:14:13 2004 +0000 +++ b/scripts/general/num2str.m Thu Jul 22 19:58:06 2004 +0000 @@ -107,7 +107,11 @@ endif else if (isnumeric (x) && round (x) == x && abs (x) < 1e10) - dgt = ceil(log10(max(abs(x(:)))))+ (min (real (x(:))) < 0); + if (max(abs(x(:))) == 0) + dgt = 1; + else + dgt = floor(log10(max(abs(x(:))))) + (min (real (x(:))) < 0) + 1; + endif fmt = sprintf("%%%dd ",dgt); elseif (isscalar (x)) fmt = "%.4g"; diff -r 1242acab4246 -r 14027e0bafa4 scripts/general/sub2ind.m --- a/scripts/general/sub2ind.m Mon Jul 12 17:14:13 2004 +0000 +++ b/scripts/general/sub2ind.m Thu Jul 22 19:58:06 2004 +0000 @@ -46,9 +46,9 @@ error ("sub2ind: index out of range"); endif else - if (all (size (first_arg) == size (arg))) + if (prod (size (first_arg)) == prod (size (arg))) if ((i > nd && arg == 1) || (arg > 0 & arg <= dims(i))) - ind += scale(i-1) * (arg - 1); + ind(:) += scale(i-1) * (arg(:) - 1); else error ("sub2ind: index out of range"); endif diff -r 1242acab4246 -r 14027e0bafa4 scripts/image/imshow.m --- a/scripts/image/imshow.m Mon Jul 12 17:14:13 2004 +0000 +++ b/scripts/image/imshow.m Thu Jul 22 19:58:06 2004 +0000 @@ -68,7 +68,11 @@ if (mvars != 3) I = varargin{1}; - if (max (varargin{1}(:)) <= 1) + if iscomplex (I) + warning("imshow: displaying real part of complex image"); + I = real (I); + endif + if (max (I(:)) <= 1) # image in [0-1]; scale to [0-255] I = I * 255; M = gray (256); @@ -79,7 +83,12 @@ ## imshow (x) ## Grayscale image [0-N] -- estimate gray levels. N = 2^ceil (log2 (max(I(:)))); - M = gray (N); + if (N <= 65536) + M = gray (N); + else + M = gray (256); + I = I / max (I(:)) * 255; + endif elseif (mvars == 2) ## imshow (x, map) or imshow (x, N) M = varargin{2}; @@ -92,6 +101,10 @@ g = varargin{2}; b = varargin{3}; tmp = [r; g; b]; + if iscomplex (tmp) + warning("imshow: displaying real part of complex rgb image"); + r = real (r); g = real (g); b = real (b); + endif if (max (tmp(:)) > 1) ## Normalise to [0-1]. r = r/255; diff -r 1242acab4246 -r 14027e0bafa4 scripts/miscellaneous/unix.m --- a/scripts/miscellaneous/unix.m Mon Jul 12 17:14:13 2004 +0000 +++ b/scripts/miscellaneous/unix.m Thu Jul 22 19:58:06 2004 +0000 @@ -18,13 +18,15 @@ ## 02111-1307, USA. ## -*- texinfo -*- -## @deftypefn {Function File} {[@var{status}, @var{text}]} isunix (@var{command}) -## @deftypefnx {Function File} {[@var{status}, @var{text}]} isunix (@var{command}, "-echo") +## @deftypefn {Function File} {[@var{status}, @var{text}]} unix (@var{command}) +## @deftypefnx {Function File} {[@var{status}, @var{text}]} unix (@var{command}, "-echo") ## Execute a system command if running under a Unix-like operating ## system, otherwise do nothing. Return the exit status of the program ## in @var{status} and any output sent to the standard output in ## @var{text}. If the optional second argument @code{"-echo"} is given, ## then also send the output from the command to the standard output. +## @end deftypefn +## @seealso{isunix, ispc, system} ## Author: octave-forge ??? ## Adapted by: jwe diff -r 1242acab4246 -r 14027e0bafa4 scripts/plot/figure.m --- a/scripts/plot/figure.m Mon Jul 12 17:14:13 2004 +0000 +++ b/scripts/plot/figure.m Thu Jul 22 19:58:06 2004 +0000 @@ -21,7 +21,8 @@ ## @deftypefn {Function File} {} figure (@var{n}) ## Set the current plot window to plot window @var{n}. This function ## currently requires X11 and a version of gnuplot that supports multiple -## frames. +## frames. If N is not specified, the next available window number is +## chosen. ## @end deftypefn ## Author: jwe diff -r 1242acab4246 -r 14027e0bafa4 src/ChangeLog --- a/src/ChangeLog Mon Jul 12 17:14:13 2004 +0000 +++ b/src/ChangeLog Thu Jul 22 19:58:06 2004 +0000 @@ -1,3 +1,26 @@ +2004-07-22 Paul Kienzle + + * DLD-FUNCTIONS/dassl.cc (Fdassl): Fix doc string. + * ov-struct.cc (Fstruct): Likewise. + * symtab.cc (Fdebug_symtab_lookups): Likewise. + +2004-07-22 David Bateman + + * data.cc (Fsize): Return 1 for dimensions exceeding ndim. + + * ov.cc (octave_value::octave_value (const ArrayN)): + New constructor. + * ov.h: Provide decl. + * ov-cx-mat.h (octave_complex_matrix (const ArrayN&)): + New constructor. + * ov-re-mat.h (octave_complex_matrix (const ArrayN&)): + New constructor. + + * ov-re-mat.h (octave_matrix(const ArrayN&)): New constructor + * pt-loop.cc (DO_ND_LOOP): New macro for use of NDArray in for loop. + (tree_simple_for_command::eval): Use it, and allow iteration over + cell arrays. + 2004-07-12 John W. Eaton * ov-intx.h: N-d array and scalar extractor functions take no args. diff -r 1242acab4246 -r 14027e0bafa4 src/data.cc --- a/src/data.cc Mon Jul 12 17:14:13 2004 +0000 +++ b/src/data.cc Thu Jul 22 19:58:06 2004 +0000 @@ -1236,8 +1236,13 @@ { dim_vector dv = args(0).dims (); - if (nd > 0 && nd <= dv.length ()) - retval(0) = dv(nd-1); + if (nd > 0) + { + if (nd <= dv.length ()) + retval(0) = dv(nd-1); + else + retval(0) = 1; + } else error ("size: requested dimension (= %d) out of range", nd); } diff -r 1242acab4246 -r 14027e0bafa4 src/ov-cx-mat.h --- a/src/ov-cx-mat.h Mon Jul 12 17:14:13 2004 +0000 +++ b/src/ov-cx-mat.h Thu Jul 22 19:58:06 2004 +0000 @@ -62,6 +62,9 @@ octave_complex_matrix (const ComplexMatrix& m) : octave_base_matrix (m) { } + octave_complex_matrix (const ArrayN& m) + : octave_base_matrix (ComplexNDArray (m)) { } + octave_complex_matrix (const ComplexDiagMatrix& d) : octave_base_matrix (ComplexMatrix (d)) { } diff -r 1242acab4246 -r 14027e0bafa4 src/ov-re-mat.h --- a/src/ov-re-mat.h Mon Jul 12 17:14:13 2004 +0000 +++ b/src/ov-re-mat.h Thu Jul 22 19:58:06 2004 +0000 @@ -63,6 +63,9 @@ octave_matrix (const NDArray& nda) : octave_base_matrix (nda) { } + octave_matrix (const ArrayN& m) + : octave_base_matrix (NDArray (m)) { } + octave_matrix (const DiagMatrix& d) : octave_base_matrix (Matrix (d)) { } diff -r 1242acab4246 -r 14027e0bafa4 src/ov-struct.cc --- a/src/ov-struct.cc Mon Jul 12 17:14:13 2004 +0000 +++ b/src/ov-struct.cc Thu Jul 22 19:58:06 2004 +0000 @@ -510,7 +510,8 @@ its values. The dimensions of each cell array of values must match.\n\ Singleton cells and non-cell values are repeated so that they fill\n\ the entire array. If the cells are empty, create an empty structure\n\ -array with the specified field names.") +array with the specified field names.\n\ +@end deftypefn") { octave_value_list retval; diff -r 1242acab4246 -r 14027e0bafa4 src/ov.cc --- a/src/ov.cc Mon Jul 12 17:14:13 2004 +0000 +++ b/src/ov.cc Thu Jul 22 19:58:06 2004 +0000 @@ -447,6 +447,13 @@ maybe_mutate (); } +octave_value::octave_value (const ArrayN& a) + : rep (new octave_matrix (a)) +{ + rep->count = 1; + maybe_mutate (); +} + octave_value::octave_value (const DiagMatrix& d) : rep (new octave_matrix (d)) { @@ -489,6 +496,13 @@ maybe_mutate (); } +octave_value::octave_value (const ArrayN& a) + : rep (new octave_complex_matrix (a)) +{ + rep->count = 1; + maybe_mutate (); +} + octave_value::octave_value (const ComplexDiagMatrix& d) : rep (new octave_complex_matrix (d)) { diff -r 1242acab4246 -r 14027e0bafa4 src/ov.h --- a/src/ov.h Mon Jul 12 17:14:13 2004 +0000 +++ b/src/ov.h Thu Jul 22 19:58:06 2004 +0000 @@ -193,6 +193,7 @@ octave_value (const Cell& c, bool is_cs_list = false); octave_value (const Matrix& m); octave_value (const NDArray& nda); + octave_value (const ArrayN& m); octave_value (const DiagMatrix& d); octave_value (const RowVector& v); octave_value (const ColumnVector& v); diff -r 1242acab4246 -r 14027e0bafa4 src/pt-loop.cc --- a/src/pt-loop.cc Mon Jul 12 17:14:13 2004 +0000 +++ b/src/pt-loop.cc Thu Jul 22 19:58:06 2004 +0000 @@ -241,6 +241,41 @@ } \ while (0) +#define DO_ND_LOOP(arg) \ + do \ + { \ + int ndims = dv.length (); \ + Array idx; \ + int steps = dv.numel () / dv (0); \ + idx.resize (ndims, idx_vector (1)); \ + idx (0) = idx_vector (':'); \ + \ + for (int i = 0; i < steps; i++) \ + { \ + MAYBE_DO_BREAKPOINT; \ + \ + octave_value val (arg.index(idx)); \ + \ + bool quit = false; \ + \ + do_for_loop_once (ult, val, quit); \ + quit = (i == steps - 1 ? true : quit); \ + \ + if (quit) \ + break; \ + \ + for (int j = 1; j < ndims; j++) \ + { \ + idx(j) = idx_vector (idx(j)(0) + 2); \ + if (idx(j)(0) < dv(j)) \ + break; \ + else \ + idx(j) = idx_vector (1); \ + } \ + } \ + } \ + while (0) + void tree_simple_for_command::eval (void) { @@ -332,42 +367,28 @@ } else if (rhs.is_matrix_type ()) { - Matrix m_tmp; - ComplexMatrix cm_tmp; - - int nr; - int steps; + NDArray m_tmp; + ComplexNDArray cm_tmp; + dim_vector dv; if (rhs.is_real_type ()) { - m_tmp = rhs.matrix_value (); - nr = m_tmp.rows (); - steps = m_tmp.columns (); + m_tmp = rhs.array_value (); + dv = m_tmp.dims (); } else { - cm_tmp = rhs.complex_matrix_value (); - nr = cm_tmp.rows (); - steps = cm_tmp.columns (); + cm_tmp = rhs.complex_array_value (); + dv = cm_tmp.dims (); } if (error_state) goto cleanup; if (rhs.is_real_type ()) - { - if (nr == 1) - DO_LOOP (m_tmp (0, i)); - else - DO_LOOP (m_tmp.extract (0, i, nr-1, i)); - } + DO_ND_LOOP(m_tmp); else - { - if (nr == 1) - DO_LOOP (cm_tmp (0, i)); - else - DO_LOOP (cm_tmp.extract (0, i, nr-1, i)); - } + DO_ND_LOOP(cm_tmp); } else if (rhs.is_map ()) { @@ -392,6 +413,12 @@ break; } } + else if (rhs.is_cell ()) + { + Cell c_tmp = rhs.cell_value (); + dim_vector dv = c_tmp.dims (); + DO_ND_LOOP(c_tmp); + } else { ::error ("invalid type in for loop expression near line %d, column %d", diff -r 1242acab4246 -r 14027e0bafa4 src/symtab.cc --- a/src/symtab.cc Mon Jul 12 17:14:13 2004 +0000 +++ b/src/symtab.cc Thu Jul 22 19:58:06 2004 +0000 @@ -1122,7 +1122,8 @@ "-*- texinfo -*-\n\ @defvr debug_symtab_lookups\n\ If the value of htis variable is nonzero, print debugging info when\n\ -searching for symbols in the symbol tables"); +searching for symbols in the symbol tables.\n\ +@end defvr"); }