2

如何向量化 R 中的以下双 for 循环?

a <-  seq(1,10, length=5)
b <- seq(0,1, length=4)
fun <- function(a,b){return(a+b)}

out <- matrix(NaN, nrow=5, ncol=4)

  for(i in 1:5) {
    for(j in 1:4) {
      out[i, j] <- fun(a[i], b[j])
    }
  }

例如,我尝试过,但没有成功。请指教,提前谢谢

outer(1:nrow(out), 1:ncol(out), FUN = fun(a,b))
mapply(out, fun)
4

2 回答 2

3

关于什么:

outer(a, b, '+')

## > outer(a, b, '+')
##       [,1]      [,2]      [,3]  [,4]
## [1,]  1.00  1.333333  1.666667  2.00
## [2,]  3.25  3.583333  3.916667  4.25
## [3,]  5.50  5.833333  6.166667  6.50
## [4,]  7.75  8.083333  8.416667  8.75
## [5,] 10.00 10.333333 10.666667 11.00
于 2013-09-24T17:36:43.627 回答
2

作为一般规则,对最内层循环进行矢量化通常足以让您获得性能提升。在这种情况下,这意味着:

for(i in 1:5) {
  out[i,]<- a[i] + b
}

假设ab都具有 O(n) 的长度,那么通过这样做,您可以确保通过 R 中的循环迭代的开销仅发生 O(n) 次,而不是 O(n^2) 次,如果您在 R 中执行两个循环。由于算法的运行时间无论如何都会是 O(n^2),额外的 O(n) 开销不会对运行时间产生太大影响。

当然,对于这个特定的示例,您可以outer像其他人建议的那样使用。

于 2013-09-24T17:51:20.450 回答