矩阵的反对角线的总和

时间:2015-11-10 01:57:23

标签: 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[3, 1] + m[2, 2] + m[1, 3],即1 + 2 + 1

我无法弄清楚如何设置迭代。据我所知,这没有任何功能(如另一个对角线的diag())。

4 个答案:

答案 0 :(得分:17)

使用

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替换为-1使用superdiagonal而+1使用subdiagonal。 -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, "-")沿着反对角线是恒定的。我们可以将[...]中的部分写为outer(1:n, n:1) == 0,如果我们用-1代替0,我们得到超反对角线,而+1则得到次反对角线。 -2和2给出超级和次级反对角线。例如,sum(m[c(outer(1:n, n:1, "-") == 1)])是次反对角线的总和。

答案 1 :(得分:4)

您可以索引要求和的元素

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

这有时被称为&#34;二级对角线&#34;或&#34;次要对角&#34;。

另一个简短的解决方案:

{
        "zipcode": "95110", 
        "state": "CA", 
        "subset": [
            {
                "date": "2015-05-01",
                "val1": "50", 
                "val2": "30.00", 
                "val3": "5.00", 
                "val4": "3.00", 
                "val5": "3"
            }, 
            {
                "date": "2015-06-01", 
                "val1": "67", 
                "val2": "31.00", 
                "val3": "5.00", 
                "val4": "3.00", 
                "val5": "4"
            }, 
            {
                "date": "2015-07-01", 
                "val1": "97", 
                "val2": "32.00", 
                "val3": "5.00", 
                "val4": "3.00", 
                "val5": "6"
            }
        ]

}