在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