changeset 4911:14027e0bafa4

[project @ 2004-07-22 19:58:06 by jwe]
author jwe
date Thu, 22 Jul 2004 19:58:06 +0000
parents 1242acab4246
children 048db020498c
files liboctave/ChangeLog liboctave/lo-specfun.cc liboctave/oct-sort.h scripts/ChangeLog scripts/general/num2str.m scripts/general/sub2ind.m scripts/image/imshow.m scripts/miscellaneous/unix.m scripts/plot/figure.m src/ChangeLog src/data.cc src/ov-cx-mat.h src/ov-re-mat.h src/ov-struct.cc src/ov.cc src/ov.h src/pt-loop.cc src/symtab.cc
diffstat 18 files changed, 187 insertions(+), 38 deletions(-) [+]
line wrap: on
line diff
--- 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  <dbateman@free.fr>
+
+	* 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  <jwe@octave.org>
 
 	* oct-inttypes.h (octave_int<T>::nbits): New function.
--- 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<double> (static_cast<long> (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 <long> (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 <long> (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);
 	}
--- 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 <config.h>
 #endif
 
-#include "oct-obj.h"
 #include "lo-mappers.h"
 #include "quit.h"
 
--- 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  <etienne@cs.uky.edu>
+
+	* general/sub2ind.m: Make reshaping index list unnecessary.
+
+2004-07-22  Paul Kienzle  <pkienzle@users.sf.net>
+
+	* miscellaneous/unix.m: Fix doc string.
+
+2004-07-22  Stefan van der Walt  <stefan@sun.ac.za>
+
+	* 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  <dbateman@free.fr>
+
+	* general/num2str.m: Fix the case of an all zero input.
+
 2004-06-22  Etienne Grossmann  <etienne@cs.uky.edu>
 
 	* general/ind2sub.m: Doc fix.
--- 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";
--- 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
--- 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;
--- 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
--- 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
--- 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  <pkienzle@users.sf.net>
+
+	* DLD-FUNCTIONS/dassl.cc (Fdassl): Fix doc string.
+	* ov-struct.cc (Fstruct): Likewise.
+	* symtab.cc (Fdebug_symtab_lookups): Likewise.
+
+2004-07-22  David Bateman  <dbateman@free.fr>
+
+	* data.cc (Fsize): Return 1 for dimensions exceeding ndim.
+
+	* ov.cc (octave_value::octave_value (const ArrayN<double>)):
+	New constructor.
+	* ov.h: Provide decl.
+	* ov-cx-mat.h (octave_complex_matrix (const ArrayN<Complex>&)):
+	New constructor.
+	* ov-re-mat.h (octave_complex_matrix (const ArrayN<double>&)):
+	New constructor.
+
+	* ov-re-mat.h (octave_matrix(const ArrayN<double>&)): 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  <jwe@octave.org>
 
 	* ov-intx.h: N-d array and scalar extractor functions take no args.
--- 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);
 	}
--- 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<ComplexNDArray> (m) { }
 
+  octave_complex_matrix (const ArrayN<Complex>& m)
+    : octave_base_matrix<ComplexNDArray> (ComplexNDArray (m)) { }
+
   octave_complex_matrix (const ComplexDiagMatrix& d)
     : octave_base_matrix<ComplexNDArray> (ComplexMatrix (d)) { }
 
--- 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<NDArray> (nda) { }
 
+  octave_matrix (const ArrayN<double>& m)
+    : octave_base_matrix<NDArray> (NDArray (m)) { }
+
   octave_matrix (const DiagMatrix& d)
     : octave_base_matrix<NDArray> (Matrix (d)) { }
 
--- 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;
 
--- 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<double>& 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<Complex>& 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))
 {
--- 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<double>& m);
   octave_value (const DiagMatrix& d);
   octave_value (const RowVector& v);
   octave_value (const ColumnVector& v);
--- 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_vector> 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",
--- 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");
 }