是否可以对依赖于每个元素的位置或索引的数组进行向量化操作?

问题描述 投票:0回答:3

让我们假设我想对向量执行此操作:

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

重点在于对每个元素执行的操作涉及到数组元素的索引或位置。

我可以以某种方式矢量化这样的操作吗?

r arrays performance vectorization
3个回答
0
投票

你可以这样做

测试.2 <- as.array(TEST.1/1:10000)


0
投票

seq_along
函数返回向量长度的索引1。

所以

TEST.2 <- TEST.1 / seq_along(TEST.1)

给你你所需要的。


0
投票

简单做

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
© www.soinside.com 2019 - 2024. All rights reserved.