在 R 中提取矩阵的非对角线元素

Extracting off-diagonal elements of a matrix in R

提问人:Simon Harmel 提问时间:12/27/2021 更新时间:12/27/2021 访问量:1028

问:

下面的非对角线元素都是 s。mat_rix0

为了提取非对角线元素,我使用了我在 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
R 函数 矩阵

评论

1赞 user20650 12/27/2021
例如,使用以下示例,然后声明要提取的值可能会提供更多信息。如果值全部为零,则很难看出正确的值或提取它们的顺序是否正确matrix(1:16, 4, 4)

答:

2赞 akrun 12/27/2021 #1

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

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

评论

1赞 Chris 12/27/2021
认为你和 OP 有不同的“关闭对角线”期望,因为你的关闭是全部关闭,与上限或下限无关,因此长度为 110,在这种情况下,OP 似乎正在寻找“一个”关闭,再次与上下无关,但长度为 10。might
0赞 akrun 12/27/2021
@Chris,我将其作为评论发布,OP 告诉我将其作为解决方案发布。所以,我认为这就是 OP 的意思
0赞 Chris 12/27/2021
我正在查看他先前输出的长度,除了引入非零的索引之外,没有抱怨,但他的检查会澄清。
0赞 akrun 12/27/2021
@Chris我也注意到了这一点。这就是我发表评论的原因,然后他回复了。我会把我的评论放在他的帖子下面
1赞 Chris 12/27/2021
并从可用的对角线中提取对角线时选择一个人的对角线。split