2

私はいくつかの動的な問題 (ベイズ規則を使用した信念の更新について) に取り組んでおり、for ループを使用する現在のソリューションは非常に遅いため、計算を高速化するための「ループレス」ソリューションを探しています。

データ フレームまたはマトリックスがあり、行ごとに同じ計算を行いたいとします。ただし、行の計算には、行rの前の計算で生成された出力が必要r-1です。このプロセスは、次のように説明できます。

Rbyn行列 、MAおよびいくつかの初期変数があるとしy0ます。

  1. [input] MA[1,] + y0 => [output] y1
  2. [input] MA[2,] + y1 => [output] y2
  3. [input] MA[3,] + y2 => [output] y3
  4. ....

最も単純な例の 1 つは、 の計算ですn!。の値n! = n * (n-1)!。ここ(n-1)!で、 は前の計算の結果です。

私が思いついた最初の関数はapplyファミリですが、適用関数は、現在のように再帰的 (または動的) 操作に適用できません。異なる入力に対して同じ計算を繰り返すだけで、出力を転送しません。他に使用できるトリックがあるかどうかはわかりません。この特定の問題に対してループのない解決策を思いつく天才はいますか?

4

3 に答える 3

1

関数にデータを格納できます。nの例!

df <- data.frame(r = 1:10)

parent.iteration <- function() {
  i <- 0
  n <- 1
  function() {
    i <<- i + 1
    n <<- n * i
    n
  }
}

# create closure
child.iteration <- parent.iteration()
df$result <- apply(df,1,function(x)child.iteration())

# continues where it left off
df$result2 <- apply(df,1,function(x)child.iteration())
df

詳細:閉鎖

于 2014-10-13T21:03:53.177 に答える
0

以下は apply ファミリの関数で動作するはずですが、これらにはループも含まれています。mclappy() を使用すると、操作を高速化できる場合があります。

ne <- new.env() # create a new environment
ne$ystore <- y0 # create an object to store the output value and initialize at y0

calc.rec <- function(x) ne$ystore <- MA[x, ] + ne$ystore
sapply(1:nrow(MA), calc.rec)

これが遅すぎる場合は、実行したい計算の正確なタイプに応じて、cumsum()、cumprod() などを使用してそれらをベクトル化できます。

于 2013-08-28T15:17:13.760 に答える