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