我正在寻找一种方法,通过语言R中的成对索引来索引对称矩阵的下三角向量。这是一些解释性代码:
背景
M
是一个n
时间n
成对矩阵,这里有随机数据(只是为了显示):
n <- 5
set.seed(0815)
M <- matrix(sample(n^2),n,n)
M[upper.tri(M)] <- t(M)[upper.tri(M)]
diag(M) <- 0
M
# [,1] [,2] [,3] [,4] [,5]
# [1,] 0 6 3 18 10
# [2,] 6 0 11 23 9
# [3,] 3 11 0 5 21
# [4,] 18 23 5 0 16
# [5,] 10 9 21 16 0
数据
我的数据 ( x
) 是矩阵的下三角向量M
:
x <- M[lower.tri(M)]
我要提取的索引对存储在一个名为的向量中i
:
i <- c(2:3,5)
目标
我现在的目标是从下三角向量中提取对,如下面的矩阵示例所示。
aim <- M[i,i][lower.tri(M[i,i])]
aim
# [1] 11 9 21
我的解决方案
由于在我的情况下M
不可用并且我不想从x
(内存问题)生成它,我创建了以下索引函数f
:
f <- function (n,i) {
r <- combn(i,2)[1,]
c <- combn(i,2)[2,]
n * r + c - (r * (r + 1))/2 - n
}
结果
res <- x[f(n,i)]
identical(res, aim)
# [1] TRUE
最后,我的问题:
在函数的 R 中是否有更优雅或已经内置的版本f
,也许也不需要n
作为参数,从长度计算它x
?
先感谢您。
斯文