gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 13:35:40 25 4
gpt4 key购买 nike

我知道在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com