我找到了以下Matlab代码来模拟非齐次泊松过程
function x = nonhomopp(intens,T)
% example of generating a
% nonhomogeneousl poisson process on [0,T] with intensity function intens
x = 0:.1:T;
m = eval([intens 'x']);
m2 = max(m); % generate homogeneouos poisson process
u = rand(1,ceil(1.5*T*m2));
y = cumsum(-(1/m2)*log(u)); %points of homogeneous pp
y = y(y<T); n=length(y); % select those points less than T
m = eval([intens 'y']); % evaluates intensity function
y = y(rand(1,n)<m/m2); % filter out some points
hist(y,10)
% then run
% t = 7 + nonhomopp('100-10*',5)
我是Matlab的新手,无法理解其工作原理。我已经阅读了所有这些函数的Mathworks页面,并且在四个地方感到困惑:
1)为什么函数定义为 x ,然后间隔也称为 x ?这是滥用记谱法吗?
2)方括号如何影响eval,
eval([intens 'x'])
为什么x是单引号?
3)为什么他们使用 cumsum 而不是 sum ?
4)给定的强度函数是\lambda (t) = 100 - 10*(t-7) with 7 \leq t \leq 12
t = 7 + nonhomopp('100-10*',5)
如何表示这个?
对不起,如果有这么多,谢谢!
答案 0 :(得分:2)
回答2)。这是一段不必要的复杂代码。要理解它,只评估方括号及其内容。它会生成字符串100-10*x
,然后对其进行评估。这是一个没有eval的版本,而是使用匿名函数。这就应该如何实施。
function x = nonhomopp(intens,T)
% example of generating a
% nonhomogeneousl poisson process on [0,T] with intensity function intens
x = 0:.1:T;
m = intens(x);
m2 = max(m); % generate homogeneouos poisson process
u = rand(1,ceil(1.5*T*m2));
y = cumsum(-(1/m2)*log(u)); %points of homogeneous pp
y = y(y<T); n=length(y); % select those points less than T
m = intens(y); % evaluates intensity function
y = y(rand(1,n)<m/m2); % filter out some points
hist(y,10)
可以像这样调用
t = 7 + honhomopp(@(x)(100-10*x),5)
答案 1 :(得分:2)
x
:x
只是输出变量。在Matlab中,函数声明为function [output variable(s)] = <function name>(input variables)
。如果函数只有一个输出,则可以省略方括号(如您的情况)。无论输入参数有多少,输入参数周围的括号都是强制性的。使用end
结束函数体也是一种好习惯,就像使用循环和if / else一样。eval
使用字符串作为输入,方括号显然是将字符串'intens'
与字符串'x'
连接起来。 x
在引号中,因为eval
再次使用字符串格式的输入,即使它引用了变量。 cumsum
和sum
采取不同的行动。 sum
返回一个标量,它是数组中所有元素的总和,而cumsum
返回另一个包含累积和的数组。如果我们的数组为[1:5]
,则sum([1:5])
将返回15,因为它是1 + 2 + 3 + 4 + 5。相反,cumsum([1:5])
将返回[1 3 6 10 15]
,其中输出数组的每个元素都是输入数组中前面元素(包括它们)的总和。 t = 7 + nonhomopp('100-10*',5)
返回的只是时间t
的值,而不是lambda的值,实际上通过查看t
最小值为7,最大值为12泊松分布本身通过直方图返回。