を仮定すると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の提案による:
各提案の実行時間 (10^5 ではなく 10000 行を使用):
使用する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
注: 上記の時間は の 3 番目の小節ですsystem.time
。各コードの最初の 2 つの測定値は破棄されました。r <- sqrt(2)
、v <- sqrt(3)
およびを使用しましdt <- pi
た。彼の元のコードでは、S[i-1]
forifelse(i==1,1,S[i-1])
と preallocatedも置き換えましたU
。