2

我正在研究一些动态问题(关于使用贝叶斯规则更新信念)并寻求“无循环”解决方案来加快计算速度,因为我当前使用 for 循环的解决方案非常慢。

假设我有一个数据框或矩阵,并且对于每一行,我都想做同样的计算。但是,对 row 的计算r需要在上一次对 row 的计算中生成的输出r-1。该过程可以通过以下方式说明:

假设我有一个R矩阵nMA和一些初始变量y0

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

最简单的例子之一可能是计算n!. 的值n! = n * (n-1)!,其中(n-1)!是上一次计算的结果。

我想出的第一个函数是apply家庭,但应用函数不能像我现在这样应用于递归(或动态)操作;它只是对不同的输入重复相同的计算,但不会向前传递输出。不确定我们是否可以使用任何其他技巧。任何天才都可以为这个特定问题提出一个无循环的解决方案吗?

4

3 回答 3

2

这不应该更快,可能更慢,但他是我避免 for 循环的尝试:

# input data
MA <- matrix(1:8, nrow=4)
y0 <- 1

# compute
l <- Reduce(function(x, y) MA[y,] + x, seq_len(nrow(MA)), init=y0, accumulate=TRUE)

# format
res2 <- data.matrix(t(as.data.frame(l[-1])))
rownames(res2) <- NULL
于 2013-08-28T09:49:01.327 回答
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 回答