Mercurial > octave
annotate scripts/statistics/distributions/discrete_inv.m @ 10524:1c6ff93c025a
Reimplement the other discrete distribution functions using lookup
author | David Bateman <dbateman@free.fr> |
---|---|
date | Thu, 15 Apr 2010 23:40:30 +0200 |
parents | a1dbe9d80eee |
children | 1740012184f9 |
rev | line source |
---|---|
7017 | 1 ## Copyright (C) 1996, 1997, 1998, 2000, 2002, 2004, 2005, 2006, 2007 |
2 ## Kurt Hornik | |
3426 | 3 ## |
3922 | 4 ## This file is part of Octave. |
5 ## | |
6 ## Octave is free software; you can redistribute it and/or modify it | |
7 ## under the terms of the GNU General Public License as published by | |
7016 | 8 ## the Free Software Foundation; either version 3 of the License, or (at |
9 ## your option) any later version. | |
3426 | 10 ## |
3922 | 11 ## Octave is distributed in the hope that it will be useful, but |
3191 | 12 ## WITHOUT ANY WARRANTY; without even the implied warranty of |
13 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
3426 | 14 ## General Public License for more details. |
15 ## | |
3191 | 16 ## You should have received a copy of the GNU General Public License |
7016 | 17 ## along with Octave; see the file COPYING. If not, see |
18 ## <http://www.gnu.org/licenses/>. | |
3191 | 19 |
3456 | 20 ## -*- texinfo -*- |
21 ## @deftypefn {Function File} {} discrete_inv (@var{x}, @var{v}, @var{p}) | |
22 ## For each component of @var{x}, compute the quantile (the inverse of | |
23 ## the CDF) at @var{x} of the univariate distribution which assumes the | |
24 ## values in @var{v} with probabilities @var{p}. | |
25 ## @end deftypefn | |
3191 | 26 |
5428 | 27 ## Author: KH <Kurt.Hornik@wu-wien.ac.at> |
3456 | 28 ## Description: Quantile function of a discrete distribution |
3191 | 29 |
3456 | 30 function inv = discrete_inv (x, v, p) |
3426 | 31 |
3191 | 32 if (nargin != 3) |
6046 | 33 print_usage (); |
3191 | 34 endif |
35 | |
4859 | 36 sz = size (x); |
3191 | 37 |
4030 | 38 if (! isvector (v)) |
3456 | 39 error ("discrete_inv: v must be a vector"); |
4030 | 40 elseif (! isvector (p) || (length (p) != length (v))) |
3456 | 41 error ("discrete_inv: p must be a vector with length (v) elements"); |
42 elseif (! (all (p >= 0) && any (p))) | |
43 error ("discrete_inv: p must be a nonzero, nonnegative vector"); | |
3191 | 44 endif |
45 | |
4859 | 46 n = numel (x); |
3456 | 47 x = reshape (x, 1, n); |
48 m = length (v); | |
10524
1c6ff93c025a
Reimplement the other discrete distribution functions using lookup
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
49 [v, idx] = sort (v); |
1c6ff93c025a
Reimplement the other discrete distribution functions using lookup
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
50 p = reshape (cumsum (p (idx) / sum (p)), m, 1); |
3191 | 51 |
10524
1c6ff93c025a
Reimplement the other discrete distribution functions using lookup
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
52 inv = NaN (sz); |
3456 | 53 if (any (k = find (x == 0))) |
4859 | 54 inv(k) = -Inf; |
3191 | 55 endif |
3456 | 56 if (any (k = find (x == 1))) |
4859 | 57 inv(k) = v(m) * ones (size (k)); |
3191 | 58 endif |
4778 | 59 |
3456 | 60 if (any (k = find ((x > 0) & (x < 1)))) |
3191 | 61 n = length (k); |
10524
1c6ff93c025a
Reimplement the other discrete distribution functions using lookup
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
62 inv (k) = v(length (p) - lookup (sort (p,"descend"), x(k)) + 1); |
3191 | 63 endif |
64 | |
65 endfunction | |
66 | |
67 |