我需要在一个非常精细的网格上模拟Matlab中的大量复合泊松过程,所以我希望能够最有效地完成它。
我需要对相同的随机数进行大量的模拟,但是参数会发生变化,所以预先绘制制服和法线是切实可行的,即使这意味着我必须抽出比我可能需要的更多并且赢得了# 39;重要的是因为它只需要按照500*n
重复次序实际复合过程生成的顺序进行一次。
我的方法如下:
让T
为我需要模拟多长时间和N网格点,然后我的网格是:
t=linspace(1,T,N);
让nrepl成为我需要的进程数,然后我模拟
P=poissrnd(lambda,nrepl,1); % Number of jumps for each replication
U=(T-1)*rand(10000,nrepl)+1; % Set of uniforms on (1,T) for jump times
N=randn(10000,nrepl); % Set of normals for jump size
然后进行复制j
:
Poiss=P(j); % Jumps for replication
Uni=U(1:Poiss,j);% Jump times
Norm=mu+sigma*N(1:Poiss,j);% Jump sizes
然后我猜这是我需要你的建议的地方,我使用这个单行,但似乎很慢:
CPP_norm=sum(bsxfun(@times,bsxfun(@gt,t,Uni),Norm),1);
在每次跳转的内部,它会创建一系列与t
0
相同的长度,直到跳转然后1
之后,相乘这将创建一个带有零的网格,直到跳转为止到达然后跳转大小,最后添加所有这些将产生网格上的整个跳转过程。
如何更有效地完成这项工作?
非常感谢。
答案 0 :(得分:1)
我不知道你在使用CPP_norm
做了什么,但是如果可以使用派生你可以获得更少的数据:
diffCPP_norm=bsxfun(@times,sparse(diff(bsxfun(@gt,t,Uni),1,2)),Norm);
使用CPP_norm=full(cumsum(diffCPP_norm))
您可以重新创建原始数据,但之后就会失去优势。