我正在尝试创建一个函数,其中在矩阵的每个步骤中,相邻的单元格和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
我不太确定如何在那里集成一个函数,所以我可以得到我想要的任何时间步长的结果矩阵。
答案 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