Попытка найти число диагоналей 1 в каждом тайле 3x3 в списке нескольких двоичных матриц - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь найти количество диагональных 1 с в каждом тайле 3x3, например,

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)

Любые предложения относительно того, какэто можно сделать?

1 Ответ

0 голосов
/ 01 ноября 2019

Предполагая, что 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))
...