识别二进制矩阵中与1相邻的所有元素

时间:2016-02-02 19:09:00

标签: r matrix binary

我正在尝试创建一个函数,其中在矩阵的每个步骤中,相邻的单元格和1的对角线也变为1。 例如,像这样:

输入

enableNetwork

第一步后的输出

0 0 0 0 0
0 1 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

到目前为止,我有这个:

1 1 1 0 0
1 1 1 0 0
1 1 1 0 0
0 0 0 0 0
0 0 0 0 0

我不太确定如何在那里集成一个函数,所以我可以得到我想要的任何时间步长的结果矩阵。

3 个答案:

答案 0 :(得分:3)

当在8个合法方向中的任何一个方向(右,左,上,下,上,下,右下,左下方)移动时,您可以确定矩阵或矩阵中是否设置了位。左上方):

spread <- function(X) unname(X |
   rbind(F, head(X, -1)) |
   rbind(tail(X, -1), F) | 
   cbind(F, X[,-ncol(X)]) |
   cbind(X[,-1], F) |
   cbind(F, rbind(F, head(X, -1))[,-ncol(X)]) |
   cbind(rbind(F, head(X, -1))[,-1], F) |
   cbind(F, rbind(tail(X, -1), F)[,-ncol(X)]) |
   cbind(rbind(tail(X, -1), F)[,-1], F)) * 1
X <- matrix(rep(c(0, 1, 0), c(6, 1, 18)), nrow=5)
spread(X)
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    1    1    1    0    0
# [2,]    1    1    1    0    0
# [3,]    1    1    1    0    0
# [4,]    0    0    0    0    0
# [5,]    0    0    0    0    0

您可以重复应用该功能以进一步传播数据:

spread(spread(X))
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    1    1    1    1    0
# [2,]    1    1    1    1    0
# [3,]    1    1    1    1    0
# [4,]    1    1    1    1    0
# [5,]    0    0    0    0    0
spread(spread(spread(X)))
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    1    1    1    1    1
# [2,]    1    1    1    1    1
# [3,]    1    1    1    1    1
# [4,]    1    1    1    1    1
# [5,]    1    1    1    1    1

答案 1 :(得分:2)

这适用于初始矩阵中的多个1,也可以在第一个/最后一列/行中。

k

修改

这是一个带参数spread <- function(x, k) { idx <- do.call(rbind, apply(which(x == 1, arr.ind = TRUE), 1, function(y) expand.grid(y[1] + k:-k, y[2] + k:-k))) idx <- idx[idx[, 1] %in% 1:nrow(x) & idx[, 2] %in% 1:ncol(x), ] x[as.matrix(idx)] <- 1 x } spread(A, 2) # [,1] [,2] [,3] [,4] [,5] # [1,] 1 1 1 1 0 # [2,] 1 1 1 1 0 # [3,] 1 1 1 1 1 # [4,] 1 1 1 1 1 # [5,] 0 0 1 1 1 (取值1,2,......)的函数,表示传播1的步骤:

{{1}}

答案 2 :(得分:0)

这可行但可能需要对更一般的情况进行一些重组,即您将在初始矩阵中遇到多个</a>的问题。如果需要这样的概括,请告诉我,我很乐意尝试制作一个。或者只使用josilber或Julius的答案。

1