Mercurial > hg > octave-nkf
changeset 8949:e31d47f2c9bb
fixes to row-reducing cummin/cummax
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Tue, 10 Mar 2009 13:18:53 +0100 |
parents | 3e161cae0bc6 |
children | d865363208d6 |
files | liboctave/ChangeLog liboctave/mx-inlines.cc src/DLD-FUNCTIONS/max.cc |
diffstat | 3 files changed, 34 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/liboctave/ChangeLog +++ b/liboctave/ChangeLog @@ -1,3 +1,7 @@ +2009-03-10 Jaroslav Hajek <highegg@gmail.com> + + * mx-inlines.cc (OP_CUMMINMAX_FCN2): r -> r0 where appropriate. + 2009-03-08 Jaroslav Hajek <highegg@gmail.com> * idx-vector.h (idx_vector::bloop): loop --> bloop.
--- a/liboctave/mx-inlines.cc +++ b/liboctave/mx-inlines.cc @@ -735,7 +735,7 @@ { \ if (xisnan (v[i])) \ { r[i] = r0[i]; nan = true; } \ - else if (xisnan (r[i]) || v[i] OP r[i]) \ + else if (xisnan (r0[i]) || v[i] OP r0[i]) \ r[i] = v[i]; \ } \ j++; v += m; r0 = r; r += m; \ @@ -743,7 +743,7 @@ while (j < n) \ { \ for (octave_idx_type i = 0; i < m; i++) \ - if (v[i] OP r[i]) \ + if (v[i] OP r0[i]) \ r[i] = v[i]; \ else \ r[i] = r0[i]; \ @@ -772,7 +772,7 @@ { \ if (xisnan (v[i])) \ { r[i] = r0[i]; ri[i] = r0i[i]; nan = true; } \ - else if (xisnan (r[i]) || v[i] OP r[i]) \ + else if (xisnan (r0[i]) || v[i] OP r0[i]) \ { r[i] = v[i]; ri[i] = j; }\ } \ j++; v += m; r0 = r; r += m; r0i = ri; ri += m; \ @@ -780,7 +780,7 @@ while (j < n) \ { \ for (octave_idx_type i = 0; i < m; i++) \ - if (v[i] OP r[i]) \ + if (v[i] OP r0[i]) \ { r[i] = v[i]; ri[i] = j; } \ else \ { r[i] = r0[i]; ri[i] = r0i[i]; } \
--- a/src/DLD-FUNCTIONS/max.cc +++ b/src/DLD-FUNCTIONS/max.cc @@ -862,6 +862,7 @@ break; \ } \ \ + int dim; \ dim_vector dv = arg1.dims (); \ if (error_state) \ { \ @@ -869,11 +870,23 @@ return retval; \ } \ \ - int dim = 0; \ - while ((dim < dv.length ()) && (dv (dim) <= 1)) \ - dim++; \ - if (dim == dv.length ()) \ - dim = 0; \ + if (nargin == 2) \ + { \ + dim = arg2.nint_value () - 1; \ + if (dim < 0 || dim >= dv.length ()) \ + { \ + error ("%s: invalid dimension", #FCN); \ + return retval; \ + } \ + } \ + else \ + { \ + dim = 0; \ + while ((dim < dv.length ()) && (dv (dim) <= 1)) \ + dim++; \ + if (dim == dv.length ()) \ + dim = 0; \ + } \ \ if (arg1.is_integer_type ()) \ { \ @@ -914,12 +927,12 @@ @noindent\n\ is equivalent to the following code:\n\ @example\n\ - colons(1:ndims (x)) = @{':'@};\n\ + w = iw = zeros (size (x));\n\ + idxw = idxx = repmat (@{':'@}, 1, ndims (x));\n\ for i = 1:size (x, dim)\n\ - idxw = idxx = colons;\n\ - idxw@{i@} = i; idxx@{i@} = 1:i;\n\ + idxw@{dim@} = i; idxx@{dim@} = 1:i;\n\ [w(idxw@{:@}), iw(idxw@{:@})] =\ - min(x(idxx@{:@}), dim);\n\ + min(x(idxx@{:@}), [], dim);\n\ endfor\n\ @end example\n\ \n\ @@ -945,12 +958,12 @@ @noindent\n\ is equivalent to the following code:\n\ @example\n\ - colons(1:ndims (x)) = @{':'@};\n\ + w = iw = zeros (size (x));\n\ + idxw = idxx = repmat (@{':'@}, 1, ndims (x));\n\ for i = 1:size (x, dim)\n\ - idxw = idxx = colons;\n\ - idxw@{i@} = i; idxx@{i@} = 1:i;\n\ + idxw@{dim@} = i; idxx@{dim@} = 1:i;\n\ [w(idxw@{:@}), iw(idxw@{:@})] =\ - max(x(idxx@{:@}), dim);\n\ + max(x(idxx@{:@}), [], dim);\n\ endfor\n\ @end example\n\ \n\