我试图从具有强度函数(lambda_time)的非均匀泊松过程中生成时间如下 -
lambda_time<-function(k,p,a,t){
k*(p-1)*(a^(p-1))*((t+a)^(-p))
}
。我在间隔(0,Tmax)之间产生“n”次的代码如下 -
Inhomogeneous<- function(lambda_time,n,k,p,a,tmax,lambdamax=NA){
if(is.na(lambdamax)){
lambdamax<- max(sapply(seq(0,tmax,length.out=2000),lambda_time,k=k,p=p,a=a))
}
t<-0
count<-1
times<-numeric()
times[1]<-t
while(times[length(times)]<tmax && count<=n){
e<-rexp(1,lambdamax)
t<-t+e
v<-runif(1)
if(t<tmax && v<=(lambda_time(k,p,a,t)/lambdamax)){
times<-c(times,t)
count<-count+1
}
}
return(times[-1])
}
。但代码很慢。我不懂为什么?有人能告诉我吗? k,p,a的值将类似于1.8,1.9,0.6或类似的东西。
答案 0 :(得分:0)
当变量被矢量化时,R运行得最好。您的编程风格让人联想到C和Fortran等低级和汇编语言,其中矢量化不会显着提高速度。
您可以采取一些措施来减少代码中的函数调用和声明量。
使用带循环语句的for循环和控制流。
for(i in 1:n){
###在这里做数学
if(times [length(times)]&lt; tmax) 破
}
预先声明向量并让R按索引访问它们(即使您不使用您生成的每个随机数)
v&lt; - runif(n = n)
t&lt; - rep(NA,n)
等...
for(i in 1:n){
###在这里做数学
### v v v [i]
if(times [length(times)]&lt; tmax) 破
}