【问题标题】:efficient vectorizisation of a double for loop双 for 循环的有效矢量化
【发布时间】:2013-09-25 01:51:20
【问题描述】:

如何向量化 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)

【问题讨论】:

  • 为什么不使用outer(a, b, fun)

标签: r apply


【解决方案1】:

怎么样:

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

【讨论】:

  • 我有一个更复杂的函数“有趣”,因此我不断收到错误“外部错误(a,b,函数(ai,bj){:dims [产品 900] 与对象的长度 [1]".. 但你的回答很有用,谢谢!
  • @T_D This 应该可以帮助您了解如何使用 outer 并重写您的“乐趣”。
  • @T_D 我会说发布您尝试使用的功能。
【解决方案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

【讨论】:

  • 我投了赞成票,因为有人投了反对票。虽然这不是最好的解决方案(很可能),但它删除了 for 循环并用矢量化替换它。我认为这不值得投反对票。
猜你喜欢
  • 2015-02-03
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
相关资源
最近更新 更多