这里是一个完全量化的方法可以得到相同的结果,它是速度更快比使用for
环
B <- mat.or.vec(K,1000) # pre-allocate
set.seed(1)
B[-1, ] <- matrix(rnorm((K-1)*100),K-1,1000) * sqrt(dt)
B <- apply(B, 2, cumsum)
个
矢量化功能,加快你的代码,你可以在下面的基准测试结果看:
test elapsed relative
1 vectorized() 2.070 1.000
2 for.loop() 181.768 87.811
的量化方法比你的两个嵌套for
-loops快约88倍。基准代码如下所示。
for.loop <- function(){ # this is your approach
BM<- matrix(0,2000,1000)
set.seed(1)
for (i in 1:1000){
for (k in 1:(K-1)){
BM[k+1, i]=BM[k,i]+sqrt(dt)*rnorm(1)
}
}
return(BM)
}
vectorized <- function(){ # this is my approach
B <- mat.or.vec(K,1000) # pre-allocate
set.seed(1)
B[-1, ] <- matrix(rnorm((K-1)*100),K-1,1000) * sqrt(dt)
B <- apply(B, 2, cumsum)
}
library("rbenchmark")
benchmark(vectorized(),
for.loop(),
replications=10,
columns=c('test', 'elapsed', 'relative'),
order = "relative")
第一5行5个COLS比较,以检查结果:
> vectorized()[1:5, 1:5]
[,1] [,2] [,3] [,4] [,5]
[1,] 0.00000000 0.000000000 0.000000000 0.000000000 0.000000000
[2,] -0.01981021 -0.009865464 -0.008371525 0.015834886 0.001562361
[3,] -0.01400290 -0.037887974 -0.037253019 0.010349073 -0.024924006
[4,] -0.04042779 -0.098675011 -0.073133176 0.018483702 -0.066867547
[5,] 0.01001941 -0.047455576 -0.048955758 -0.001085329 -0.123356698
> for.loop()[1:5, 1:5]
[,1] [,2] [,3] [,4] [,5]
[1,] 0.00000000 0.000000000 0.000000000 0.000000000 0.000000000
[2,] -0.01981021 -0.009865464 -0.008371525 0.015834886 0.001562361
[3,] -0.01400290 -0.037887974 -0.037253019 0.010349073 -0.024924006
[4,] -0.04042779 -0.098675011 -0.073133176 0.018483702 -0.066867547
[5,] 0.01001941 -0.047455576 -0.048955758 -0.001085329 -0.123356698
你的缺少)在1:(K-1)。尽管如此,我认为你可以做这个没有循环的模拟。 – Fernando
谢谢大家,伙计们!你帮了很多! – user3187955
@ user3187955如果你认为你的问题已经得到解答,你可以[接受答案](http://meta.stackexchange.com/a/5235),你只能接受他们中的一个,但当你有足够的声誉upvoting;) –