我无法正确编写switch语句。并且可用的示例没有帮助。基本上,语句应该检查单元格中的值是什么(选择:1,2,4,8,16,32,64,128)并基于该行增加/减少行数和列数。一些switch语句有2个计算。
library(raster)
fdr<-raster("fdr.tif")
row1<-50
col1<-50
cell1<-fdr[row1,col1] #The point of origin
switch (cell1,
4={row2 = row1 + 1
},
2={row2 = row1 + 1 & col2 = col1 + 1
},
1={col2 = col1 + 1
},
128={row2 = row1 - 1 & col2 = col1 + 1
},
64={row2 = row1 - 1
},
32={row2 = row1 - 1 & col2 = col1 - 1
},
16={col2 = col1 - 1
},
8={row2 = row1 + 1 & col2 = col1 - 1
}
)
我也对switch语句以外的技术持开放态度。或任何想让它更快的想法。最后,我将它包装成一个函数,并为每个单元格(像素)执行此操作。
数据:
答案 0 :(得分:2)
这就是你编写switch
并让它返回行向量的方式,col:
row1 <- 50
col1 <- 50
cell1 <- 16
rowcol <- switch(as.character(cell1),
'4' = c(row1 + 1, col1),
'2' = c(row1 + 1, col1 + 1),
'1' = c(row1, col1 + 1),
'128' = c(row1 - 1, col1 + 1),
'64' = c(row1 - 1, col1),
'32' = c(row1 - 1, col1 - 1),
'16' = c(row1, col1 - 1),
'8' = c(row1 + 1, col1 - 1))
rowcol
> rowcol
[1] 50 49
您不希望重复对大型栅格的每个元素执行switch
;这将是冰川。这是一个矢量化操作,从任何行/列开始并执行单个更新/移动
## generate some dummy raster data
set.seed(1)
m <- matrix(sample(2^(0:7), 9, replace = TRUE), ncol = 3)
## collect row and column indices for raster
dd <- cbind(r = as.vector(row(m)), c = as.vector(col(m)))
## look-up matrix for row and col shifts
lu <- matrix(c( 0, 1,
1, 1,
1, 0,
1, -1,
0, -1,
-1, -1,
-1, 0,
-1, 1), ncol = 2, byrow = TRUE)
## set rownames with powers of 2 to allow indexing using `m`
rownames(lu) <- 2^(0:7)
## need `m` as a vector
mc <- as.character(as.vector(m))
## which cell to move to next given values of `m`
move <- dd + lu[mc, ]
move
给出了
> move
r c
[1,] 2 1
[2,] 3 1
[3,] 3 0
[4,] 0 3
[5,] 3 3
[6,] 2 3
[7,] 0 4
[8,] 1 2
[9,] 2 2
根据输入数据,这是正确的。现在你有了进行下一步行动并跟踪事物的问题。在此示例中,移动会将您转移到栅格外的单元格中,用于9个单元格中的3个单元格(r
或c
中的0个单元格,因此如果您将其编入索引m
为了在单元格中移动获得2的幂,你只能获得6个值
> m[move]
[1] 4 16 32 32 128 2
因此,当你走路时,你需要跟踪这个,但这应该让你开始。