在R中获取邻居函数
get neighbors function in R
我有一个数据,它实际上是一个 256 x 256 矩阵形式的图像。我想编写一个函数,调用它 "get.nbhd" 为一个像素选择 4 个邻居并将其存储为一个向量。然后在需要时调用该函数。如果像素在角落或边界上,将分别有 2 个和 3 个邻居。这是一个玩具数据集。所以对于中间的任何像素说 d[i,j] 4 个邻居将是 {d[i-1,j],d[i+1,j],d[i,j+1],d[i ,j-1]}。对于 4 个角像素,2 个邻居将是 {d[i,j-1],[i+1,j]} ,{d[i,j+1],d[i+1,j]}, {d[i-1,j],d[i,j-1]}, {d[i-1,j],d[i,j+1]}。顶部和底部边界像素将有 3 个邻居作为 {d[i-1,j],[i+1,j],d[i,j-1]}。感谢任何帮助。
> x<- matrix(rbinom(8*8,1,0.5),8,8)
> x
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 1 1 1 0 1 0 1 0
[2,] 1 1 0 1 0 1 1 1
[3,] 1 1 1 1 1 0 0 0
[4,] 1 1 1 0 1 1 1 1
[5,] 1 1 1 1 0 1 0 0
[6,] 1 1 1 0 0 1 1 1
[7,] 0 1 1 1 1 0 0 0
[8,] 0 1 0 0 0 1 1 0
此函数为您提供向量中 m[i, j]
的邻居:
get.nbhd <- function(m, i, j) {
# get indices
idx <- matrix(c(i-1, i+1, i, i, j, j, j+1, j-1), ncol = 2)
# set out of bound indices to 0
idx[idx[, 1] > nrow(m), 1] <- 0
idx[idx[, 2] > ncol(m), 2] <- 0
return (x[idx])
}
函数从使用零作为索引的事实中获益,不会给出错误,只是 return 没有值。因此,太大的索引设置为零。
作为示例,我使用了与您不同的矩阵,因为如果只有 1 和 0,检查结果的正确性并不容易。
x<- matrix(1:25,5,5)
x
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 6 11 16 21
## [2,] 2 7 12 17 22
## [3,] 3 8 13 18 23
## [4,] 4 9 14 19 24
## [5,] 5 10 15 20 25
get.nbhd(x, 2, 3)
## [1] 11 13 17 7
get.nbhd(x, 1, 5)
## [1] 22 16
get.nbhd(x, 5, 3)
## [1] 14 20 10
我有一个数据,它实际上是一个 256 x 256 矩阵形式的图像。我想编写一个函数,调用它 "get.nbhd" 为一个像素选择 4 个邻居并将其存储为一个向量。然后在需要时调用该函数。如果像素在角落或边界上,将分别有 2 个和 3 个邻居。这是一个玩具数据集。所以对于中间的任何像素说 d[i,j] 4 个邻居将是 {d[i-1,j],d[i+1,j],d[i,j+1],d[i ,j-1]}。对于 4 个角像素,2 个邻居将是 {d[i,j-1],[i+1,j]} ,{d[i,j+1],d[i+1,j]}, {d[i-1,j],d[i,j-1]}, {d[i-1,j],d[i,j+1]}。顶部和底部边界像素将有 3 个邻居作为 {d[i-1,j],[i+1,j],d[i,j-1]}。感谢任何帮助。
> x<- matrix(rbinom(8*8,1,0.5),8,8)
> x
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 1 1 1 0 1 0 1 0
[2,] 1 1 0 1 0 1 1 1
[3,] 1 1 1 1 1 0 0 0
[4,] 1 1 1 0 1 1 1 1
[5,] 1 1 1 1 0 1 0 0
[6,] 1 1 1 0 0 1 1 1
[7,] 0 1 1 1 1 0 0 0
[8,] 0 1 0 0 0 1 1 0
此函数为您提供向量中 m[i, j]
的邻居:
get.nbhd <- function(m, i, j) {
# get indices
idx <- matrix(c(i-1, i+1, i, i, j, j, j+1, j-1), ncol = 2)
# set out of bound indices to 0
idx[idx[, 1] > nrow(m), 1] <- 0
idx[idx[, 2] > ncol(m), 2] <- 0
return (x[idx])
}
函数从使用零作为索引的事实中获益,不会给出错误,只是 return 没有值。因此,太大的索引设置为零。
作为示例,我使用了与您不同的矩阵,因为如果只有 1 和 0,检查结果的正确性并不容易。
x<- matrix(1:25,5,5)
x
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 6 11 16 21
## [2,] 2 7 12 17 22
## [3,] 3 8 13 18 23
## [4,] 4 9 14 19 24
## [5,] 5 10 15 20 25
get.nbhd(x, 2, 3)
## [1] 11 13 17 7
get.nbhd(x, 1, 5)
## [1] 22 16
get.nbhd(x, 5, 3)
## [1] 14 20 10