矩阵的反对角线之和

Sum of antidiagonal of a matrix

我正在尝试对矩阵的反对角线(次对角线、次对角线)的元素求和。

所以,如果我有一个矩阵 m:

m <- matrix(c(2, 3, 1, 4, 2, 5, 1, 3, 7), 3)
m

     [,1] [,2] [,3]
[1,]    2    4    1
[2,]    3    2    3
[3,]    1    5    7

我正在寻找总和 m[3, 1] + m[2, 2] + m[1, 3],即 1 + 2 + 1

我不知道如何设置迭代。据我所知,没有这方面的功能(比如 diag() 用于另一个对角线)。

您可以索引出您想要求和的元素

sum(m[cbind(3:1, 1:3)])

这里有一个不使用循环的简单方法,假设你的矩阵是 m:

sum(diag(matrix(c(m[,3],m[,2],m[,1]), nrow=3)))

使用

m <- matrix(c(2, 3, 1, 4, 2, 5, 1, 3, 7), 3)

1) 如图所示反转行(或列 - 未显示),取对角线并求和:

sum(diag(m[nrow(m):1, ]))
## [1] 4

2) 或者像这样使用 rowcol:

sum(m[c(row(m) + col(m) - nrow(m) == 1)])
## [1] 4

这推广到其他反对角线,因为 row(m) + col(m) - nrow(m) 在所有反对角线上都是常数。对于这样的概括,将 c(...) 中的部分写成 row(m) + col(m) - nrow(m) - 1 == 0 可能更方便,因为这样用 -1 替换 0 使用超对角线,用 +1 替换使用次对角线。 -2 和 2 分别使用第二个超对角线和次对角线等等。

3) 或者使用这个索引序列:

n <- nrow(m)
sum(m[seq(n, by = n-1, length = n)])
## [1] 4

4) 或像这样使用 outer

n <- nrow(m)
sum(m[!c(outer(1:n, n:1, "-"))])
## [1] 4

这个也很好地推广到其他反对角线,因为 outer(1:n, n:1, "-") 沿着反对角线是常数。我们可以写 m[outer(1:n, n:1) == 0] ,如果我们用 -1 替换 0 ,我们得到上反对角线,用 +1 得到次反对角线。 -2 和 2 给出 super super 和 sub sub 反对角线。例如sum(m[c(outer(1:n, n:1, "-") == 1)])是次反对角线的和。

这有时称为 "secondary diagonal" 或 "minor diagonal"。

另一个简短的解决方案:

sum(diag(apply(m,2,rev)))