矩阵的反对角线之和
Sum of antidiagonal of a 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[3, 1] + m[2, 2] + m[1, 3]
,即 1 + 2 + 1
我不知道如何设置迭代。据我所知,没有这方面的功能(比如 diag()
用于另一个对角线)。
您可以索引出您想要求和的元素
sum(m[cbind(3:1, 1:3)])
这里有一个不使用循环的简单方法,假设你的矩阵是 m:
sum(diag(matrix(c(m[,3],m[,2],m[,1]), nrow=3)))
使用
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 替换 0 使用超对角线,用 +1 替换使用次对角线。 -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, "-")
沿着反对角线是常数。我们可以写 m[outer(1:n, n:1) == 0]
,如果我们用 -1 替换 0 ,我们得到上反对角线,用 +1 得到次反对角线。 -2 和 2 给出 super super 和 sub sub 反对角线。例如sum(m[c(outer(1:n, n:1, "-") == 1)])
是次反对角线的和。
这有时称为 "secondary diagonal" 或 "minor diagonal"。
另一个简短的解决方案:
sum(diag(apply(m,2,rev)))
我正在尝试对矩阵的反对角线(次对角线、次对角线)的元素求和。
所以,如果我有一个矩阵 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()
用于另一个对角线)。
您可以索引出您想要求和的元素
sum(m[cbind(3:1, 1:3)])
这里有一个不使用循环的简单方法,假设你的矩阵是 m:
sum(diag(matrix(c(m[,3],m[,2],m[,1]), nrow=3)))
使用
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 替换 0 使用超对角线,用 +1 替换使用次对角线。 -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, "-")
沿着反对角线是常数。我们可以写 m[outer(1:n, n:1) == 0]
,如果我们用 -1 替换 0 ,我们得到上反对角线,用 +1 得到次反对角线。 -2 和 2 给出 super super 和 sub sub 反对角线。例如sum(m[c(outer(1:n, n:1, "-") == 1)])
是次反对角线的和。
这有时称为 "secondary diagonal" 或 "minor diagonal"。
另一个简短的解决方案:
sum(diag(apply(m,2,rev)))