我试图将矩阵的反对角线(次要对角线,次对角线)上的元素相加。
所以,如果我有一个矩阵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()
)。
答案 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)或使用row
和col
,如下所示:
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"
}
]
}