Mercurial > octave-nkf
diff scripts/statistics/base/run_count.m @ 4885:28ab079d8f0e
[project @ 2004-04-30 04:21:33 by jwe]
author | jwe |
---|---|
date | Fri, 30 Apr 2004 04:21:33 +0000 |
parents | 38c61cbf086c |
children | 54b076a24718 |
line wrap: on
line diff
--- a/scripts/statistics/base/run_count.m Fri Apr 30 04:12:37 2004 +0000 +++ b/scripts/statistics/base/run_count.m Fri Apr 30 04:21:33 2004 +0000 @@ -19,43 +19,75 @@ ## -*- texinfo -*- ## @deftypefn {Function File} {} run_count (@var{x}, @var{n}) -## Count the upward runs in the columns of @var{x} of length 1, 2, ..., -## @var{n}-1 and greater than or equal to @var{n}. +## Count the upward runs along the first non-singleton dimension of +## @var{x} of length 1, 2, ..., @var{n}-1 and greater than or equal +## to @var{n}. If the optional argument @var{dim} is given operate +## along this dimension ## @end deftypefn ## Author: FL <Friedrich.Leisch@ci.tuwien.ac.at> ## Description: Count upward runs -function retval = run_count (x, n) +function retval = run_count (x, n, dim) - [xr, xc] = size(x); + if (nargin != 2 && nargin != 3) + usage ("run_count (x, n) or run_count (x, n, dim)"); + endif - tmp = zeros (xr,xc); - retval = zeros (n, xc); - - for j = 1 : xc - run = 1; - count = 1; - - for k = 2 : xr + nd = ndims (x); + sz = size (x); + if (nargin != 3) + %% Find the first non-singleton dimension + dim = 1; + while (dim < nd + 1 && sz (dim) == 1) + dim = dim + 1; + endwhile + if (dim > nd) + dim = 1; + endif + else + if (! (isscalar (dim) && dim == round (dim)) && dim > 0 && + dim < (nd + 1)) + error ("run_count: dim must be an integer and valid dimension"); + endif + endif - if x(k, j) < x(k-1, j) - tmp(run, j) = count; - run = run + 1; - count = 0; - endif - - count = count + 1; + if (! (isscalar (n) && n == round (n)) && n > 0 ) + error ("run_count: n must be a positive integer"); + endif + + nd = ndims (x); + if (dim != 1) + perm = [1 : nd]; + perm (1) = dim; + perm (dim) = 1; + x = permute (x, perm); + endif - endfor - - tmp(run, j) = count; - + sz = size (x); + idx = cell (); + for i = 1 : nd + idx {i} = 1 : sz(i); endfor + c = sz (1); + tmp = zeros ([c + 1, sz(2 : end)]); + infvec = Inf * ones ([1, sz(2 : end)]); + ind = find (diff ([infvec; x; -infvec]) < 0); + tmp (ind (2 : end) - 1) = diff (ind); + tmp = tmp (idx {:}); + + sz (1) = n; + retval = zeros (sz); for k=1 : (n-1) - retval(k, :) = sum (tmp == k); + idx {1} = k; + retval (idx {:}) = sum (tmp == k); endfor - retval(n, :) = sum (tmp >= n); + idx {1} = n; + retval (idx {:}) = sum (tmp >= n); + + if (dim != 1) + retval = ipermute (retval, perm); + endif endfunction