试图在多个二进制矩阵列表中的每个3x3瓦片中找到1的对角线数量

问题描述 投票:0回答:1

例如,我试图在每个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)

关于如何做到这一点的任何建议?

r list diagonal
1个回答
0
投票

假设m如结尾处的注解所示(尤其是条目是双精度而不是整数),位置是固定的差异,因此我们可以将rollapply与函数identical一起使用。

library(zoo)

nr <- nrow(m)

sum(rollapply(c(m), list(c(0, nr+1, 2*nr+2)), identical, c(1, 1, 1), align = "left")) +
sum(rollapply(c(m), list(c(0, nr-1, 2*nr-2)), identical, c(1, 1, 1), align = "left"))
## 3

注意

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))
© www.soinside.com 2019 - 2024. All rights reserved.