如何计算零和一的矩阵中对角线的数量(由1组成)

时间:2018-08-15 14:08:00

标签: r matrix

我有矩阵,在矩阵的每个单元中随机分配0或1。 5 x 5的矩阵可能看起来像这样:

A
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    1    0    1
[2,]    0    0    1    0    1
[3,]    0    1    1    1    1
[4,]    1    1    0    1    1
[5,]    1    1    0    1    0

例如通过代码生成:

mm <- matrix(0, 5, 5)
A<-apply(mm, c(1, 2), function(x) sample(c(0, 1), 1))

对角线按以下方式由1组成:

enter image description here

即,有3条长度为2的对角线和2条长度为3的对角线。此外,也没有长度为4和5的对角线。

我会将结果存储在数组v中:

v
[1] 3 2 0 0

v[1]存储长度为2的对角线,v[2]存储长度为3的对角线,依此类推。

我的尝试是错误的。它基于:

which(A!=0)
 [1]  4  5  8  9 10 11 12 13 18 19 20 21 22 23 24

在此数组中:

4 8 12

5 9 13

对应于长度为3的2条对角线。长度为2的3条对角线为:

18 22
19 23
20 24

(我检查了相差4的数字)。但是,如果有全为1的列,则此方法不起作用(尝试A[5,5]<-1)。

1 个答案:

答案 0 :(得分:5)

row(A) + col(A)对于反对角线是恒定的,所以:

tabulate_runs <- function(x, n) {
  tab <- with(rle(x), tabulate(lengths[values == 1]))
  replace(integer(n), seq_along(tab), tab)
 }
rowSums(simplify2array(tapply(A, row(A) + col(A), tabulate_runs, nrow(A))))[-1]
## [1] 3 2 0 0

注意

在问题中产生A的代码不可重现,因为它使用随机数而不设置种子,因此为了重现性,我们使用以下代码:

A <- structure(c(0L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 
0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L), .Dim = c(5L, 
5L))