forked from mingyuanzhou/EPM
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtruncated_Poisson_rnd.m
40 lines (36 loc) · 954 Bytes
/
truncated_Poisson_rnd.m
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
function x = truncated_Poisson_rnd(lambda)
% draw random samples from a truncated Poisson distribution
% P(x=k) = poisspdf(k,lambda)/(1-exp(-lambda))
% Coded by Mingyuan Zhou, 042014
%%Demo:
%lambda=0.3;aa=hist(truncated_Poisson_rnd(lambda*ones(1,10000)),1:20);
%plot(1:20,aa/sum(aa),'r',1:20,poisspdf(1:20,lambda)./(1-exp(-lambda)));
lambda1=lambda(lambda>1);
lambda2=lambda(lambda<=1);
x=zeros(length(lambda),1);
x1 = zeros(length(lambda1),1);
x2 = zeros(length(lambda2),1);
while 1
dex=find(x1==0);
if isempty(dex)
break
else
lambdadex=lambda1(dex);
temp = poissrnd(lambdadex);
idex = temp>0;
x1(dex(idex))=temp(idex);
end
end
x(lambda>1)=x1;
while 1
dex=find(x2==0);
if isempty(dex)
break
else
lambdadex=lambda2(dex);
temp = 1+poissrnd(lambdadex);
idex = rand(size(temp))<1./(temp);
x2(dex(idex))=temp(idex);
end
end
x(lambda<=1)=x2;