Предполагая S[0] = 1
, вы можете построить U следующим образом:
Ncols <- 252
Nrows <- 100000
U <- matrix(exp((r-v^2/2)*dt+v*sqrt(dt)*rnorm(Ncols*Nrows)), ncol=Ncols, nrow=Nrows)
U <- do.call(rbind, lapply(1:Nrows, function(j)cumprod(U[j,])))
РЕДАКТИРОВАТЬ: используя предложения Джошуа и Бена:
версия продукта:
U <- matrix(exp((r-v^2/2)*dt+v*sqrt(dt)*rnorm(Ncols*Nrows)), ncol=Ncols, nrow=Nrows)
U <- t(apply(U, 1, cumprod))
Суммарная версия:
V <- matrix((r-v^2/2)*dt+v*sqrt(dt)*rnorm(Ncols*Nrows), ncol=Ncols, nrow=Nrows)
V <- exp( t(apply(V, 1, cumsum)) )
РЕДАКТИРОВАТЬ: как было предложено @Paul:
Время выполнения каждого предложения (с использованием 10000 строк вместо 10 ^ 5):
Использование apply + cumprod
user system elapsed
0.61 0.01 0.62
Использование apply + cumsum
user system elapsed
0.61 0.02 0.63
Использование исходного кода OP
user system elapsed
67.38 0.00 67.52
Примечания: Время, показанное выше, является третьим тактом system.time
. Первые две меры для каждого кода были отброшены. Я использовал r <- sqrt(2)
, v <- sqrt(3)
и dt <- pi
. В его исходном коде я также заменил S[i-1]
на ifelse(i==1,1,S[i-1])
и предварительно выделил U
.
person
Ferdinand.kraft
schedule
20.03.2013
S[i-1]
имеет нулевую длину, когдаi=1
. - person Joshua Ulrich   schedule 21.03.2013Rcpp
, и вы получите ускорение на несколько порядков. - person Gary Weissman   schedule 21.03.2013Rcpp
, я бы сначала попытался избавиться от двойного цикла for и перейти к векторизации. - person Paul Hiemstra   schedule 21.03.2013