blob: ba23f6fe2c7eeb6dfa07f7bd6cb98a13500de021 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
function r = multirnd(theta,k)
%MULTIRND - Random vector from multinomial distribution.
% r = multirnd(theta,k) returns a vector randomly selected
% from the multinomial distribution with parameter vector
% theta, and count k (i.e. sum(r) = k).
%
% Note: if k is unspecified, then it is assumed k=1.
%
% Author: David Ross
%
%--------------------------------------------------------
% Check the arguments.
%--------------------------------------------------------
error(nargchk(1,2,nargin));
% make sure theta is a vector
if ndims(theta) > 2 | all(size(theta) > 1)
error('theta must be a vector');
end
% if theta is a row vector, convert it to a column vector
if size(theta,1) == 1
theta = theta';
end
% make sure k is a scalar?
% if the number of samples has not been provided, set
% it to one
if nargin == 1
k = 1;
end
%--------------------------------------------------------
% Main...
%--------------------------------------------------------
n = length(theta);
theta_cdf = cumsum(theta);
r = zeros(n,1);
random_vals = rand(k,1);
for j = 1:k
index = min(find(random_vals(j) <= theta_cdf));
r(index) = r(index) + 1;
end
|