ベクトル化と、それを適用して R の for ループを高速化する方法については認識していますが、各反復が前の反復の結果に依存している、または依存しているベクトルを使用してコードを高速化する方法を理解できません。反復ランダム間隔計算。
例えば:
ジョシュ・・・ごめんなさい。だから、ここに詳細があります:
m <- c(1, 1)
w.r <- c(0.33592935393, 0.63825353030, 0.15335253356 )
rlistl は 3 つの 2x2 行列のリストです。ですから、会話のために、
r0 <- matrix(0, 2, 2)
r1 <- matrix(1, 2, 2)
r2 <- matrix(2, 2, 2)
rlist <- list(r0, r1, r2)
N <- 500
E <- matrix(0, N, 2)
for(i in 1:N) {
r <- c(c(1:3) %*% rmultinom(1, 1, w.r))
E[i, ] <- mvrnorm(1, m, rlist[[r]])
}
「r <- multinom()」の計算をループの外で実行しようとしましたが、rprof は、費やされた時間の大部分が明らかに mvnorm にあることを示しています。ベクトルを使用してこれを高速化する方法をRで見つけられる人はいますか?
ここに別の例があります
for(i in 1:N) {
if(d$V[i, 1] & d$V[i, 2]) QQ <- 1
else if(! d$V[i, 1] & d$V[i, 2]) QQ <- 2
else if(! d$V[i, 1] & ! d$V[i, 2]) QQ <- 3
else if(d$V[i, 1] & ! d$V[i, 2]) QQ <- 4
U[i, ] <- r1bvtruncnorm(mux=mu.U[i, ]/sd.r[r1], rho=rho, q=QQ)
}
それをより速く実行する方法を理解できません。私の問題の一部は、私が C/C++ プログラマーであることですが、R について調べようとしていて、何か簡単なことを見逃していないことを確認したいと考えています。
ありがとう。
編集:
ジャスティン:
わかりました-あなたの提案を試しましたが、恐れていたように、rep() は期待どおりに動作しません。毎回別の乱数が必要ですが、rep() を使用すると、rmultinom を 1 回呼び出すだけで、結果が 100 回複製されます。
>rep(c(c(1:3) %*% rmultinom(1, 1, ww.r)), 100)
[1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[38] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[75] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
> rep(c(c(1:3) %*% rmultinom(1, 1, ww.r)), 100)
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[38] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[75] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1