矩阵的反对角线的总和

Win*_*981 14 r sum matrix diagonal

我试图沿矩阵的反对角线(次对角线,次对角线)求和元素.

所以,如果我有一个矩阵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
Run Code Online (Sandbox Code Playgroud)

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

我无法弄清楚如何设置迭代.据我所知,没有这个功能(就像diag()其他对角线一样).

G. *_*eck 19

运用

m <- matrix(c(2, 3, 1, 4, 2, 5, 1, 3, 7), 3)
Run Code Online (Sandbox Code Playgroud)

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

sum(diag(m[nrow(m):1, ]))
## [1] 4
Run Code Online (Sandbox Code Playgroud)

2)或使用rowcol这样:

sum(m[c(row(m) + col(m) - nrow(m) == 1)])
## [1] 4
Run Code Online (Sandbox Code Playgroud)

这可以推广到其他反对角线,因为row(m) + col(m) - nrow(m)它沿着所有的反对角线.对于这样的泛化,可能更方便的是在内部编写部分c(...),row(m) + col(m) - nrow(m) - 1 == 0因为那时用-1替换0使用superdiagonal而+1使用子对角线.-2和2分别使用第二个超对角线和次对角线,依此类推.

3)或使用此序列索引:

n <- nrow(m)
sum(m[seq(n, by = n-1, length = n)])
## [1] 4
Run Code Online (Sandbox Code Playgroud)

4)或使用outer这样的:

n <- nrow(m)
sum(m[!c(outer(1:n, n:1, "-"))])
## [1] 4
Run Code Online (Sandbox Code Playgroud)

这个很好地概括为其他反对角线,因为outer(1:n, n:1, "-")沿对角线是恒定的.我们可以在[...]中编写部分outer(1:n, n:1) == 0,如果我们用-1代替0,我们得到超反对角线,而+1则得到子反对角线.-2和2给出超级和次级反对角线.例如sum(m[c(outer(1:n, n:1, "-") == 1)]),子反对角线的总和.


Ben*_*min 5

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

另一个简短的解决方案:

sum(diag(apply(m,2,rev)))
Run Code Online (Sandbox Code Playgroud)