Pie*_*t93 5 for-loop r vectorization
我知道在R中使用for-loop通常是不必要的,因为它支持向量化.我想尽可能高效地编程,有关以下示例代码的问题.
我有一个六边形网格,我正在计算单元格的数量,在我的例子中,从左下角开始,从1到225计数,向右移动.因此,单元格16在单元格1的正上方放置了一点偏移.请参阅快照:

因此,如果我有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)
Run Code Online (Sandbox Code Playgroud)
这对应于单元格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]
}
Run Code Online (Sandbox Code Playgroud)
因此,如果Y是'偶数',则X必须舍入,如果Y是'un-even',则必须是最大值.
有没有办法在没有for循环的情况下使用矢量化?
您可以将其矢量化如下
(Y - 1) * gridsize + ifelse(Y %% 2 == 1, round(Xcells), ceiling(Xcells))
# [1] 1 2 3 16
Run Code Online (Sandbox Code Playgroud)
(我不确定预先计算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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |