双循环的有效矢量化

时间:2013-09-24 17:33:27

标签: r apply

如何在R?

中对以下双循环进行矢量化?
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)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

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

假设ab都有长度O(n),那么通过这种方式,你可以确保迭代R中的循环的开销只会产生O(n)如果你在R中进行两个循环,则不是O(n ^ 2)次。因为算法的运行时间无论如何都是O(n ^ 2),额外的O(n)开销不会影响运行时间很长。

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