我在R中没有矩阵的上三角形部分(没有对角线),并且想要从上三角形部分生成对称矩阵(在对角线上有1但可以稍后调整).我通常这样做:
res.upper <- rnorm(4950)
res <- matrix(0, 100, 100)
res[upper.tri(res)] <- res.upper
rm(res.upper)
diag(res) <- 1
res[lower.tri(res)] <- t(res)[lower.tri(res)]
Run Code Online (Sandbox Code Playgroud)
这工作正常,但现在我想使用非常大的矩阵.因此,我希望避免同时存储res.upper和res(填充0).有没有什么方法可以直接将res.upper转换为对称矩阵而不必先初始化矩阵res?
我找到了一个 R 包Rlof,它使用多线程来计算距离矩阵,它做得很好。
但是,该函数的输出distmc是向量而不是矩阵。应用as.matrix到这个“dist”对象比距离的多线程计算要昂贵得多。
查看函数 help,打印对角线和上三角形的选项在那里,但我不明白应该在哪里使用它们。
有没有办法as.matrix以某种方式节省时间?
可重现的例子:
set.seed(42)
M1 = matrix(rnorm(15000*20), nrow = 15000, ncol =20)
system.time({dA = distmc(M1, method = "euclidean", diag = TRUE,
upper = TRUE, p = 2)})
system.time(A = as.matrix(dA))
Run Code Online (Sandbox Code Playgroud)