【问题标题】:Extracting off-diagonal elements of a matrix in R在R中提取矩阵的非对角线元素
【发布时间】:2021-12-26 17:37:21
【问题描述】:

下面mat_rix的非对角元素都是0s。

为了提取非对角元素,我使用了我在 SO 上找到的解决方案:odiag <- function(x) x[(n <- nrow(x))^2-(1:n)*(n-1)]

但是当我使用odiag(mat_rix) 时,输出包含non-0 元素。我想知道是什么问题以及如何解决?

x="
 0.4850377 0.000000 0.00000000 0.00000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
 0.0000000 0.510766 0.00000000 0.00000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
 0.0000000 0.000000 0.05767389 0.00000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
 0.0000000 0.000000 0.00000000 0.07539841 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
 0.0000000 0.000000 0.00000000 0.00000000 0.3134951 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
 0.0000000 0.000000 0.00000000 0.00000000 0.0000000 0.679101 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
 0.0000000 0.000000 0.00000000 0.00000000 0.0000000 0.000000 0.5067036 0.0000000 0.0000000 0.0000000 0.0000000
 0.0000000 0.000000 0.00000000 0.00000000 0.0000000 0.000000 0.0000000 0.1829717 0.0000000 0.0000000 0.0000000
 0.0000000 0.000000 0.00000000 0.00000000 0.0000000 0.000000 0.0000000 0.0000000 0.3722585 0.0000000 0.0000000
 0.0000000 0.000000 0.00000000 0.00000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.3907239 0.0000000
 0.0000000 0.000000 0.00000000 0.00000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0287955"

mat_rix <- as.matrix(read.table(text=x))

odiag(mat_rix)

[1] 0.000000 0.000000 0.000000 0.000000 0.000000 0.679101 0.000000 0.000000 0.000000 0.000000 0.000000

【问题讨论】:

  • 使用例如matrix(1:16, 4, 4) 的示例可能会提供更多信息,然后声明您要提取哪些值。如果它们都为零,则很难查看正确的值或提取它们的顺序是否正确

标签: r function matrix


【解决方案1】:

如果我们需要非对角线,创建一个row 索引不等于column 索引的函数

odiag <- function(x) x[col(x) != row(x)]
odiag(mat_rix)

如果我们需要从对角线上向上/向下一的值

odiag2 <- function(x, offdiag = "up") {
    ind <- if(offdiag == "up") -1 else 1
    x[row(x) - col(x) == ind]
}
odiag2(mat_rix, "up")
[1] 0 0 0 0 0 0 0 0 0 0

【讨论】:

  • 认为你和 OP might 有不同的“非对角线”期望,因为你的 off 完全关闭,不知道上关或下关,因此长度为 110,在这种情况下,它出现 OP 是寻找“一个”关闭,再次与上、下无关,但长度为 10。
  • @Chris 我将此作为评论发布,OP 告诉我作为解决方案发布。所以,我认为这就是 OP 的意思
  • 我正在查看他先前输出的长度,除了索引带来非零之外,没有人抱怨,但他的检查会澄清。
  • @Chris 我也注意到了。这就是我评论的原因,然后他回复了。我会把我的 cmets 放在他的帖子下面
  • 并使用split从可用的extracting off diagonal中选择一个对角线。
猜你喜欢
  • 2020-02-05
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多