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)或使用row
和col
这样:
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)])
,子反对角线的总和.
归档时间: |
|
查看次数: |
4629 次 |
最近记录: |