让我们假设我想对向量执行此操作:
TEST.1 <- runif(10000, min = 0, max = 10000) # Whatever, doesn't mind
TEST.2 <- array(0, dim = 10000) # To save the results
for(i in 1:10000) TEST.2[i] <- TEST.1[i]/i
重点在于对每个元素执行的操作涉及到数组元素的索引或位置。
我可以以某种方式矢量化这样的操作吗?
你可以这样做
测试.2 <- as.array(TEST.1/1:10000)
seq_along
函数返回向量长度的索引1。
所以
TEST.2 <- TEST.1 / seq_along(TEST.1)
给你你所需要的。
简单做
TEST.2 <- TEST.1 / (1:n)
这要快得多:
library(microbenchmark)
n <- 1000000
TEST.1 <- runif(n, min = 0, max = n) # Whatever, doesn't mind
TEST.2 <- array(0, dim = n) # To save the results
microbenchmark({for(i in 1:n) TEST.2[i] <- TEST.1[i]/i},
times=5)
microbenchmark({TEST.2 <- TEST.1 / (1:n)},
times=5)
Unit: milliseconds
expr min lq mean
{ for (i in 1:n) TEST.2[i] <- TEST.1[i]/i } 55.70905 56.03472 61.05193
median uq max neval
57.76358 66.06474 69.68756 5
Unit: milliseconds
expr min lq mean median uq
{ TEST.2 <- TEST.1/(1:n) } 2.563011 2.66718 2.703565 2.702002 2.725995
max neval
2.859639 5