R 矩阵的反对角和

R 矩阵的反对角和,r,matrix,sum,diagonal,R,Matrix,Sum,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 m您可以索引出要求和的元素 sum(m[cbind(3:1, 1:3)]) 下面是一种不使用循环的简单方法,假设矩阵为m: sum(diag(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您可以索引出要求和的元素

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

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

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

2)或像这样使用

sum(m[c(row(m) + col(m) - nrow(m) == 1)])
## [1] 4
n <- nrow(m)
sum(m[!c(outer(1:n, n:1, "-"))])
## [1] 4
这推广到其他反对角线,因为
行(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

这一点也很好地推广到其他反对角线,因为
外部(1:n,n:1,“-”)
沿反对角线是常数。我们可以写
m[outer(1:n,n:1)==0]
如果我们用-1替换0,我们得到超级反对角,用+1我们得到次反对角-2和2给出了超-超和次-次反对角线。例如,
sum(m[c(外部(1:n,n:1,“-”==1)])
是次反对角线的和。

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

另一个简短的解决方案:

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

谢谢你。有些语法是我无法理解的,所以我需要通过非常全面和布局良好的示例来学习。谢谢。这实际上是我所设想的,但我不知道如何写。我正在摸索一个嵌套的“for”循环,它显然没有给我想要的。谢谢。这是非常直接和直观的。这被称为“次要”或“次要”对角线。
n <- nrow(m)
sum(m[!c(outer(1:n, n:1, "-"))])
## [1] 4
sum(diag(apply(m,2,rev)))