r - 六边形网格中细胞数量的矢量化计算

标签 r for-loop vectorization

我知道在 R 中使用 for 循环通常是不必要的,因为它支持向量化。我希望编程尽可能高效,这是我关于以下示例代码的问题。

我有一个六边形网格,我正在计算单元格的数量,在我的示例中,从左下角开始,向右计数,从 1 到 225。因此,单元格 16 放置在单元格 1 正上方稍有一点偏移的位置。 查看快照: example of grid I'm working with

因此,如果我有 Y 坐标,则 X 坐标必须是四舍五入或上限。在我的应用程序中,用户指出单元格,我将其保存并在 for 循环中遍历单元格以确定他选择的单元格,如下所示,其中包含用户可能选择的 Xcells 和 Ycells 的玩具输入值:

gridsize <- 15 

 Xcells <-c(0.8066765, 1.8209879, 3.0526517, 0.5893240)
 Ycells <-c(0.4577802, 0.4577802, 0.5302311, 1.5445425)

 clicks <- length(Xcells)
 cells <-vector('list', clicks)

这对应于单元格 1 2 3 和 16. 4 次点击。现在确定细胞数量:

  Y <- ceiling(Ycells)
      for(i in 1:clicks){
        if(Y[i]%%2==1){
           X[i] <- round(Xcells[i])
        }
      else{
         X[i]<- ceiling(Xcells[i])
         }

      #determine the cell numbers and store in predefined list
      cells[[i]] <- (Y[i]-1)*gridsize + X[i]
       }

因此,如果 Y 为“偶数”,则 X 必须四舍五入,如果 Y 为“非偶数”,则必须为上限值。

有没有办法通过使用矢量化来实现这一点,无需 for 循环?

最佳答案

您可以按如下方式对其进行矢量化

(Y - 1) * gridsize + ifelse(Y %% 2 == 1, round(Xcells), ceiling(Xcells))
# [1]  1  2  3 16

(我不确定预先计算 round(Xcells)ceiling(Xcells) 是否会进一步改善这一点 - 您可以尝试)

<小时/>

另一个选择(如果你想避免ifelse)可能是

(Y - 1) * gridsize + cbind(ceiling(Xcells), round(Xcells))[cbind(1:length(Xcells), Y %% 2 + 1)]
# [1]  1  2  3 16

关于r - 六边形网格中细胞数量的矢量化计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39739316/

相关文章:

c++ - 英特尔编译器 (ICC) 无法自动矢量化内部循环(矩阵乘法)

将数据框 reshape 为宽形状

r - 处理负值时如何修复R中的累积和

python - 交错两个 numpy 索引数组,每个数组中的一项

Python:np.vectorize 返回 "float"

c - 我的 for 循环是否有问题导致它在屏幕上显示不正确的星号?

r - 提取数据框中每组内的最大值

r - 生成两组数字,其中每组数字之和及其点积之和为 N

c++ - 将随机数插入数组,其中每个值都通过 for 循环输入

C++程序没有进入for循环