我有矩阵,在矩阵的每个单元中随机分配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组成:
即,有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
)。
答案 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))