矩阵反对角线之和

23
我想要计算矩阵中反对角线(次对角线,副对角线)上的元素之和。
所以,如果我有一个矩阵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()函数那样用于此目的的函数。


3
这被称为“次要对角线”或“副对角线”。 - Benjamin
5个回答

23

使用

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给出了超级超级和次次反对角线。例如,sum(m[c(outer(1:n, n:1, "-") == 1)])是次反对角线的总和。


谢谢您。一些语法对我来说有点超出了,所以我需要通过您非常详细和完整的示例逐步学习。 - Windstorm1981

5

这有时被称为“次对角线”或“副对角线”。

另一个简短的解决方案:

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

4
你可以索引出你想要求和的元素。
sum(m[cbind(3:1, 1:3)])

谢谢。这实际上是我所设想的,但我不知道如何编写它。我一直在尝试使用嵌套的“for”循环,但显然没有得到我想要的结果。 - Windstorm1981

2

以下是一种简单的方法,不需要使用循环,假设您的矩阵为m:

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

0
# setup
m <- matrix(c(2, 3, 1, 4, 2, 5, 1, 3, 7), 3)
n <- nrow(m)

# solution
diag(diag(m[n:1,]))[n:1,]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接