试图在多个二进制矩阵列表中的每个 3x3 块中找到 1 的对角线数
Trying to find the number of diagonals of 1 in each 3x3 tile in multiple binary matrice list
我试图找出每个 3x3 方块中对角线 1 的数量,例如
0 0 1 1 0 0 1 1 1 0 1 1
0 1 0 0 1 0 1 1 1 0 1 0
1 0 0 or 0 0 1 or 1 1 1 or 1 0 0
例如,3x3 拼贴中的其他值仅对角线无关紧要。我所说的对角线是指主对角线以及反向主对角线。 例如下面的矩阵会输出 3 条对角线,
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
我正在阅读矩阵列表...
set.seed(1234)
mat1 <- matrix(sample(c(0,1), 225, prob=c(0.8,0.2), replace=TRUE), nrow = 15)
set.seed(99)
mat2 <- matrix(sample(c(0,1), 225, prob=c(0.8,0.2), replace=TRUE), nrow = 15)
set.seed(123)
mat3 <- matrix(sample(c(0,1), 225, prob=c(0.8,0.2), replace=TRUE), nrow = 15)
mat_list <- list(mat1, mat2, mat3)
关于如何做到这一点有什么建议吗?
假设 m
如末尾的注释所示(特别是条目是双精度而不是整数),位置之间的距离是固定的,因此我们可以使用 rollapply
函数 identical
。
library(zoo)
num_diags <- function(m) {
nr <- nrow(m)
sum(rollapply(c(m), list(c(0, nr+1, 2*nr+2)), identical, c(1, 1, 1))) +
sum(rollapply(c(m), list(c(0, nr-1, 2*nr-2)), identical, c(1, 1, 1)))
}
num_diags(m)
## 3
要将其应用于矩阵列表:
sapply(mat_list, num_diags)
备注
m <- structure(c(1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 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, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), .Dim = c(8L,
15L), .Dimnames = list(NULL, NULL))
我试图找出每个 3x3 方块中对角线 1 的数量,例如
0 0 1 1 0 0 1 1 1 0 1 1
0 1 0 0 1 0 1 1 1 0 1 0
1 0 0 or 0 0 1 or 1 1 1 or 1 0 0
例如,3x3 拼贴中的其他值仅对角线无关紧要。我所说的对角线是指主对角线以及反向主对角线。 例如下面的矩阵会输出 3 条对角线,
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
我正在阅读矩阵列表...
set.seed(1234)
mat1 <- matrix(sample(c(0,1), 225, prob=c(0.8,0.2), replace=TRUE), nrow = 15)
set.seed(99)
mat2 <- matrix(sample(c(0,1), 225, prob=c(0.8,0.2), replace=TRUE), nrow = 15)
set.seed(123)
mat3 <- matrix(sample(c(0,1), 225, prob=c(0.8,0.2), replace=TRUE), nrow = 15)
mat_list <- list(mat1, mat2, mat3)
关于如何做到这一点有什么建议吗?
假设 m
如末尾的注释所示(特别是条目是双精度而不是整数),位置之间的距离是固定的,因此我们可以使用 rollapply
函数 identical
。
library(zoo)
num_diags <- function(m) {
nr <- nrow(m)
sum(rollapply(c(m), list(c(0, nr+1, 2*nr+2)), identical, c(1, 1, 1))) +
sum(rollapply(c(m), list(c(0, nr-1, 2*nr-2)), identical, c(1, 1, 1)))
}
num_diags(m)
## 3
要将其应用于矩阵列表:
sapply(mat_list, num_diags)
备注
m <- structure(c(1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 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, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), .Dim = c(8L,
15L), .Dimnames = list(NULL, NULL))