1
## Copyright (C) 1995, 1996, 1997, 2005, 2006, 2007 Kurt Hornik
3
## This file is part of Octave.
5
## Octave is free software; you can redistribute it and/or modify it
6
## under the terms of the GNU General Public License as published by
7
## the Free Software Foundation; either version 3 of the License, or (at
8
## your option) any later version.
10
## Octave is distributed in the hope that it will be useful, but
11
## WITHOUT ANY WARRANTY; without even the implied warranty of
12
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
## General Public License for more details.
15
## You should have received a copy of the GNU General Public License
16
## along with Octave; see the file COPYING. If not, see
17
## <http://www.gnu.org/licenses/>.
20
## @deftypefn {Function File} {} geornd (@var{p}, @var{r}, @var{c})
21
## @deftypefnx {Function File} {} geornd (@var{p}, @var{sz})
22
## Return an @var{r} by @var{c} matrix of random samples from the
23
## geometric distribution with parameter @var{p}, which must be a scalar
24
## or of size @var{r} by @var{c}.
26
## If @var{r} and @var{c} are given create a matrix with @var{r} rows and
27
## @var{c} columns. Or if @var{sz} is a vector, create a matrix of size
31
## Author: KH <Kurt.Hornik@wu-wien.ac.at>
32
## Description: Random deviates from the geometric distribution
34
function rnd = geornd (p, r, c)
37
if (! (isscalar (r) && (r > 0) && (r == round (r))))
38
error ("geornd: r must be a positive integer");
40
if (! (isscalar (c) && (c > 0) && (c == round (c))))
41
error ("geornd: c must be a positive integer");
45
if (any (size (p) != 1) && ((length (size (p)) != length (sz)) ||
46
any (size (p) != sz)))
47
error ("geornd: p must be scalar or of size [r, c]");
50
if (isscalar (r) && (r > 0))
52
elseif (isvector(r) && all (r > 0))
55
error ("geornd: r must be a positive integer or vector");
58
if (any (size (p) != 1) && ((length (size (p)) != length (sz)) ||
59
any (size (p) != sz)))
60
error ("geornd: n must be scalar or of size sz");
70
if (!(p >= 0) || !(p <= 1))
71
rnd = NaN * ones (sz);
73
rnd = Inf * ones (sz);
74
elseif ((p > 0) & (p < 1));
75
rnd = floor (- rande(sz) ./ log (1 - p));
80
rnd = floor (- rande(sz) ./ log (1 - p));
82
k = find (!(p >= 0) | !(p <= 1));
84
rnd(k) = NaN * ones (1, length (k));
89
rnd(k) = Inf * ones (1, length (k));