On 22-Aug-2006, Nicolas Guilbert wrote: | Package: octave2.9 | Version: 2.9.7-2 | | Steps to reproduce: | octave:1> cumsum(zeros(1,0)) | panic: Floating point exception -- stopping myself...
Please try the following patch. It also fixes a similar problem with the sum and prod functions. | Would expect ans==0 I think the result should be an empty matrix of the same size as the argument, which also has the advantage of being compatible with Matlab. Thanks, jwe liboctave/ChangeLog: 2006-08-22 John W. Eaton <[EMAIL PROTECTED]> * mx-inlines.cc (MX_ND_CUMULATIVE_OP): Correctly detect empty arrays. If array is empty, return value is same size as array. (MX_ND_REDUCTION): Correctly detect empty arrays. If array is empty, produce correctly sized return value. Index: liboctave/mx-inlines.cc =================================================================== RCS file: /cvs/octave/liboctave/mx-inlines.cc,v retrieving revision 1.48 diff -u -u -r1.48 mx-inlines.cc --- liboctave/mx-inlines.cc 10 Feb 2006 21:30:42 -0000 1.48 +++ liboctave/mx-inlines.cc 22 Aug 2006 18:24:17 -0000 @@ -372,24 +372,17 @@ dim_vector dv = this->dims (); \ int nd = this->ndims (); \ \ - int empty = true; \ + int empty = false; \ \ for (int i = 0; i < nd; i++) \ { \ - if (dv(i) > 0) \ + if (dv(i) == 0) \ { \ - empty = false; \ + empty = true; \ break; \ } \ } \ \ - if (empty) \ - { \ - dim_vector retval_dv (1, 1); \ - retval.resize (retval_dv, INIT_VAL); \ - return retval; \ - } \ - \ /* We need to find first non-singleton dim. */ \ \ if (dim == -1) \ @@ -435,36 +428,39 @@ \ retval.resize (dv, INIT_VAL); \ \ - octave_idx_type nel = dv.numel (); \ - \ - octave_idx_type k = 1; \ - \ - for (octave_idx_type result_idx = 0; result_idx < nel; result_idx++) \ + if (! empty) \ { \ - OCTAVE_QUIT; \ + octave_idx_type nel = dv.numel (); \ \ - for (octave_idx_type j = 0; j < n_elts; j++) \ + octave_idx_type k = 1; \ + \ + for (octave_idx_type result_idx = 0; result_idx < nel; result_idx++) \ { \ - OCTAVE_QUIT; \ + OCTAVE_QUIT; \ \ - EVAL_EXPR; \ + for (octave_idx_type j = 0; j < n_elts; j++) \ + { \ + OCTAVE_QUIT; \ \ - iter_idx += incr; \ - } \ + EVAL_EXPR; \ \ - if (k == reset_at) \ - { \ - base = next_base; \ - next_base += base_incr; \ - iter_idx = base; \ - k = 1; \ - } \ - else \ - { \ - base++; \ - iter_idx = base; \ - k++; \ - } \ + iter_idx += incr; \ + } \ + \ + if (k == reset_at) \ + { \ + base = next_base; \ + next_base += base_incr; \ + iter_idx = base; \ + k = 1; \ + } \ + else \ + { \ + base++; \ + iter_idx = base; \ + k++; \ + } \ + } \ } \ \ retval.chop_trailing_singletons (); \ @@ -487,24 +483,17 @@ dim_vector dv = this->dims (); \ int nd = this->ndims (); \ \ - int empty = true; \ + bool empty = false; \ \ for (int i = 0; i < nd; i++) \ { \ - if (dv(i) > 0) \ + if (dv(i) == 0) \ { \ - empty = false; \ + empty = true; \ break; \ } \ } \ \ - if (empty) \ - { \ - dim_vector retval_dv (1, 1); \ - retval.resize (retval_dv, INIT_VAL); \ - return retval; \ - } \ - \ /* We need to find first non-singleton dim. */ \ \ if (dim == -1) \ @@ -548,47 +537,50 @@ \ retval.resize (dv, INIT_VAL); \ \ - octave_idx_type nel = dv.numel () / n_elts; \ - \ - octave_idx_type k = 1; \ - \ - for (octave_idx_type i = 0; i < nel; i++) \ + if (! empty) \ { \ - OCTAVE_QUIT; \ + octave_idx_type nel = dv.numel () / n_elts; \ \ - ACC_TYPE prev_val = INIT_VAL; \ + octave_idx_type k = 1; \ \ - for (octave_idx_type j = 0; j < n_elts; j++) \ + for (octave_idx_type i = 0; i < nel; i++) \ { \ - OCTAVE_QUIT; \ + OCTAVE_QUIT; \ \ - if (j == 0) \ + ACC_TYPE prev_val = INIT_VAL; \ + \ + for (octave_idx_type j = 0; j < n_elts; j++) \ { \ - retval(iter_idx) = elem (iter_idx); \ - prev_val = retval(iter_idx); \ + OCTAVE_QUIT; \ + \ + if (j == 0) \ + { \ + retval(iter_idx) = elem (iter_idx); \ + prev_val = retval(iter_idx); \ + } \ + else \ + { \ + prev_val = prev_val OP elem (iter_idx); \ + retval(iter_idx) = prev_val; \ + } \ + \ + iter_idx += incr; \ } \ - else \ + \ + if (k == reset_at) \ { \ - prev_val = prev_val OP elem (iter_idx); \ - retval(iter_idx) = prev_val; \ + base = next_base; \ + next_base += base_incr; \ + iter_idx = base; \ + k = 1; \ } \ - \ - iter_idx += incr; \ + else \ + { \ + base++; \ + iter_idx = base; \ + k++; \ + } \ } \ - \ - if (k == reset_at) \ - { \ - base = next_base; \ - next_base += base_incr; \ - iter_idx = base; \ - k = 1; \ - } \ - else \ - { \ - base++; \ - iter_idx = base; \ - k++; \ - } \ } \ \ retval.chop_trailing_singletons (); \ -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]