如何在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)
答案 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
}
假设a
和b
都有长度O(n),那么通过这种方式,你可以确保迭代R中的循环的开销只会产生O(n)如果你在R中进行两个循环,则不是O(n ^ 2)次。因为算法的运行时间无论如何都是O(n ^ 2),额外的O(n)开销不会影响运行时间很长。
当然,对于此特定示例,您可以像其他人建议的那样使用outer
。