# HG changeset patch # User jwe # Date 1192123648 0 # Node ID b353c370a315362027e9629103f324916e517616 # Parent 0058799917ac33a142a3d0363081c97e59baf86a [project @ 2007-10-11 17:27:28 by jwe] diff -r 0058799917ac -r b353c370a315 scripts/ChangeLog --- a/scripts/ChangeLog Thu Oct 11 17:17:03 2007 +0000 +++ b/scripts/ChangeLog Thu Oct 11 17:27:28 2007 +0000 @@ -1,3 +1,9 @@ +2007-10-11 Arno Onken + + * statistics/distributions/hygernd.m: Allow size to be specified + as a scalar. Handle three argument case. Allow T, M, and N to be + scalars or matrices of a common size. + 2007-10-11 John W. Eaton * plot/__go_draw_axes__.m (get_axis_limits): diff -r 0058799917ac -r b353c370a315 scripts/statistics/distributions/hygernd.m --- a/scripts/statistics/distributions/hygernd.m Thu Oct 11 17:17:03 2007 +0000 +++ b/scripts/statistics/distributions/hygernd.m Thu Oct 11 17:27:28 2007 +0000 @@ -20,12 +20,17 @@ ## -*- texinfo -*- ## @deftypefn {Function File} {} hygernd (@var{t}, @var{m}, @var{n}, @var{r}, @var{c}) ## @deftypefnx {Function File} {} hygernd (@var{t}, @var{m}, @var{n}, @var{sz}) +## @deftypefnx {Function File} {} hygernd (@var{t}, @var{m}, @var{n}) ## Return an @var{r} by @var{c} matrix of random samples from the ## hypergeometric distribution with parameters @var{t}, @var{m}, ## and @var{n}. ## ## The parameters @var{t}, @var{m}, and @var{n} must positive integers ## with @var{m} and @var{n} not greater than @var{t}. +## +## The parameter @var{sz} must be scalar or a vector of matrix +## dimensions. If @var{sz} is scalar, then a @var{sz} by @var{sz} +## matrix of random samples is generated. ## @end deftypefn function rnd = hygernd (t, m, n, r, c) @@ -39,35 +44,55 @@ endif sz = [r, c]; elseif (nargin == 4) - ## A potential problem happens here if all args are scalar, as - ## we can distiguish between the command syntax. This is quite - ## ambigous! I assume that if the last arg is a vector then - ## then third form is assumed. This means that you can't define - ## and r-by-r matrix with a single scalar! - - if (isscalar (r)) - sz = [1, floor(m)]; - m = t; - t = n; - n = r; - elseif (isvector(r) && all (r > 0)) - sz = r(:)'; + if (isvector (r) && all (r > 0) && all (r == round (r))) + if (isscalar (r)) + sz = [r, r]; + else + sz = r(:)'; + endif else error ("hygernd: r must be a vector of positive integers"); endif - else + elseif (nargin != 3) print_usage (); endif - if (!isscalar (t) || !isscalar (m) || !isscalar (n)) - error ("hygernd: t, m and n must all be positive integers"); + if (! isscalar (t) || ! isscalar (m) || ! isscalar (n)) + [retval, t, m, n] = common_size (t, m, n); + if (retval > 0) + error ("hygernd: t, m and n must be of common size or scalar"); + endif + if (nargin > 3) + if (any (sz != size (t))) + error ("hygernd: t, m and n must have the same size as implied by r and c or must be scalar"); + endif + else + sz = size (t); + endif + elseif (nargin == 3) + sz = 1; endif - if ((t < 0) | (m < 0) | (n <= 0) | (t != round (t)) | - (m != round (m)) | (n != round (n)) | (m > t) | (n > t)) - rnd = NaN * ones (sz) + ## NaN elements + ne = (! (t >= 0) | ! (m >= 0) | ! (n > 0) | ! (t == round (t)) | ! (m == round (m)) | ! (n == round (n)) | ! (m <= t) | ! (n <= t)); + + if (! isscalar (t)) + rnd = zeros (sz); + rnd(ne) = NaN; + rn = rand (sz); + for i = find (! ne) + v = 0 : n(i); + p = hygepdf (v, t(i), m(i), n(i)); + rnd(i) = v(lookup (cumsum (p(1 : end-1)) / sum (p), rn(i)) + 1); + endfor else - rnd = discrete_rnd (0 : n, hygepdf (0 : n, t, m, n), sz); + if (ne) + rnd = NaN * ones (sz); + else + v = 0:n; + p = hygepdf (v, t, m, n); + rnd = v(lookup (cumsum (p(1:end-1)) / sum (p), rand (sz)) + 1); + endif endif endfunction