【问题标题】:Sum of antidiagonal of a matrix矩阵的对角线之和
【发布时间】:2016-02-10 20:02:07
【问题描述】:

我正在尝试对矩阵的对角线(次对角线、次对角线)上的元素求和。

所以,如果我有一个矩阵 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() 用于另一个对角线)。

【问题讨论】:

  • 这称为“次要”或“次要”对角线。

标签: r matrix sum diagonal


【解决方案1】:

你可以索引出你想要求和的元素

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

【讨论】:

  • 谢谢。这实际上是我的设想,但无法弄清楚如何编写它。我正在摸索一个嵌套的“for”循环,显然它没有给我想要的东西。
【解决方案2】:

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

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

【讨论】:

  • 谢谢。这非常简单直观。
【解决方案3】:

使用

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 替换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 给出超超和亚亚对角线。例如sum(m[c(outer(1:n, n:1, "-") == 1)]) 是子对角线的和。

【讨论】:

  • 谢谢你。有些语法超出了我的能力范围,所以我需要通过你非常彻底和布局合理的示例来处理。
【解决方案4】:

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

另一个简短的解决方案:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-16
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多