2011-07-08 11 views
1

以下は、私が取り組んでいるコードの一部の簡略化されたバージョンです(混乱を避けるために、多くの追加の計算が省略されています)。これはちょうどcumsum機能の変更された形式です。私はホイールを再発明したくないので、この機能はすでに存在していますか?そうでない場合は、どのスキームが最高のスピードを提供するでしょうか?変更されたcumsum関数

#Set up the data 
set.seed(1) 
junk <- rnorm(1000000) 
junk1 <- rnorm(1000000) 
cumval <- numeric(1000000) 

#Initialize the accumulator 
cumval[1] <- 1 

#Perform the modified cumsum 
system.time({ 
for (i in 2:1000000) cumval[i] <- junk[i] + (junk1[i] * cumval[i-1])  
}) 

#Plot the result 
plot(cumval, type="l")  
+0

うこれがどのように使われているかもう少し説明してください。 'junk [1]'と 'junk1 [1]'はあなたのアルゴリズムで決して使われないことに注意してください... – Tommy

答えて

1

このアルゴリズムは、compilerパッケージに完全に適合するものです。

#Set up the data 
set.seed(1) 
junk <- rnorm(1000000) 
junk1 <- rnorm(1000000) 

# The original code 
f <- function(junk, junk1) { 
    cumval <- numeric(1000000) 
    cumval[1] <- 1 
    for (i in 2:1000000) cumval[i] <- junk[i] + (junk1[i] * cumval[i-1]) 
    cumval 
} 
system.time(f(junk, junk1)) # 4.11 secs 

# Now try compiling it... 
library(compiler) 
g <- cmpfun(f) 
system.time(g(junk, junk1)) # 0.98 secs 

...そう、このアルゴリズムはどのような方法で「典型的」であるかどうかを知るために興味深いものになるだろう - その場合には、コンパイラは、おそらくさらに、このような状況に合わせて最適化することができ...

1

これは高速ですが、正しい結果が得られません。 実行この

set.seed(1) 

N <- 10 

junk <- rnorm(N) 

junk1 <- rnorm(N) 

cumval <- numeric(N) 
cumval.1 <- numeric(N) 
cumval[1] <- 1 

for(i in 2:N) cumval[i] <- junk[i] + junk1[i]*cumval[i-1] 
cumval 

cumval.1 <- cumsum(junk[-1] + (junk1[-1] * cumval.1[-N])) 

cumval.1 

、あなたがcumvalとcumval.1も同じ長さではないことがわかります。

漸化関係を書き換える必要があります。 再発を非漸化式に変換する方法がありません。

+0

これは答えではありませんが、@Sethの答えに対するコメントです。しかし、あなたのポイントは正しいようです。 – Andrie

1

cumval [5]を考慮してください。パターンは、第五項の表現これはあるかもしれないことを示唆している

j[5] +jk[5]j[4] + jk[5]jk[4]j[3] + jk[5]jk[4]jk[3]j[2] + jk[5]jk[4]jk[3]jk[2]

は(に近い?):ジャンクのため[] Jを使用し、[] junk1と*の記号を省略するために、その拡大はなりをJK
sum( j[1:5] * c(1, Reduce("*" , rev(jk[2:5]), accumulate=TRUE)) 
+0

"Reduce"を含む変更された "cumsum"(Gabor Gの反応に注意)のもう一つのバージョンです。 http://r.789695.n4.nabble.com/Cumsum-with-a-max-and-min-value-td3059498.html私はまだそれがなぜ機能するのか分かりませんでしたが、あなたの解決策では何かが崩れるかもしれません。 –

関連する問題