R 替换在嵌套循环中的长度为零
我对嵌套循环有问题,代码如下:R 替换在嵌套循环中的长度为零,r,for-loop,nested-loops,R,For Loop,Nested Loops,我对嵌套循环有问题,代码如下: T=2 dt=0.001 K=floor(T/dt) t= seq(0,T,dt) BM<- matrix(0,2000,1000) for (i in 1:1000){ for (k in 1:K-1){ BM[k+1,i]=BM[k,i]+sqrt(dt)*rnorm(1) } } 循环中有什么问题? 它的目标是模拟1000条布朗运动的样本路径。这就是问题所在: for (k in 1:K-1){ 你的优先权被取消了。这将有助于: for (k i
T=2
dt=0.001
K=floor(T/dt)
t= seq(0,T,dt)
BM<- matrix(0,2000,1000)
for (i in 1:1000){
for (k in 1:K-1){
BM[k+1,i]=BM[k,i]+sqrt(dt)*rnorm(1)
}
}
循环中有什么问题?
它的目标是模拟1000条布朗运动的样本路径。这就是问题所在:
for (k in 1:K-1){
你的优先权被取消了。这将有助于:
for (k in 1:(K-1)){
等价地(对于K>0
):
矢量化更好:
for (k in seq(K-1)) {
BM[k+1,] <- BM[k,]+sqrt(dt)*rnorm(2000)
}
for(k在序列(k-1)中){
BM[k+1,]这就是问题所在:
for (k in 1:K-1){
您的优先级已关闭。这将起作用:
for (k in 1:(K-1)){
等价地(对于K>0
):
矢量化更好:
for (k in seq(K-1)) {
BM[k+1,] <- BM[k,]+sqrt(dt)*rnorm(2000)
}
for(k在序列(k-1)中){
BM[k+1,]这是一种完全矢量化的方法,它给出了相同的结果,并且比使用进行
循环更快
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)
对于
-循环,矢量化方法比两个嵌套的快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")
这是一种完全矢量化的方法,它给出了相同的结果,并且比使用进行
循环更快
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)
对于
-循环,矢量化方法比两个嵌套的快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")
在1:(K-1)。我想你可以在没有环路的情况下做这个模拟。谢谢大家,伙计们!你们帮了很多忙!@ USSR3187955,如果你认为你的问题已经被回答了,你可以只接受其中一个,但是当你有足够的投票权的时候,你可以选择多于一个的投票;你错过的A)在1:(K-1)我想你可以在没有环路的情况下做这个模拟。谢谢大家,各位!你们帮了很多忙!@ USSR3187955,如果你认为你的问题已经被回答了,你只能接受其中一个,但是当你有足够的声誉来支持你的投票时,你可以投票超过一个。chmarking在这里,matrix(0,k,1000)
需要更少的击键hmm,从来没有听说过mat.或.vec
因为每个人都在这里进行基准测试,matrix(0,k,1000)
需要更少的击键