【发布时间】:2016-10-03 11:01:07
【问题描述】:
我在 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)]
这很好用,但现在我想处理非常大的矩阵。因此,我希望避免同时存储 res.upper 和 res(填充为 0)。有什么办法可以直接将 res.upper 转换为对称矩阵,而不必先初始化矩阵 res?
【问题讨论】:
-
我可以编写编译后的代码,有时我也会这样做以加快我的功能。但是,我真的不明白如何避免使用额外的内存。在 C/C++ 代码中,我还会先初始化一个像上面的 res 一样的对象。那不会也使用额外的内存吗?或者在使用 C/C++ 时这不是问题,因为这些语言中的内存分配更“智能”?这可能是个愚蠢的问题,但我是统计学家而不是计算机科学家,所以我真的不知道内存分配在内部是如何工作的。
-
你不必为我编写函数,这不是问题。我熟悉编译和内联包。我只是没有足够的背景来理解这如何解决我的记忆问题。但是,如果您向我保证确实如此,我会编写该函数(如果您将其作为答案而不是评论给出,我会接受您的答案)。
-
您是否尝试过使用
bigmemory包中的big.matrix?可能是一种解决您的内存限制的方法 -
无论如何,最终的矩阵都必须从 kernlab 库中转换为 kernelMatrix 类。我不知道这是否适用于 big.matrix 但我一定会看看它!谢谢你的提示!我不知道那个包,这是我第一次使用这么大的矩阵。
-
您还可以找到有用的“Matrix”包——即
sparseMatrix(i = sequence(1:99), j = rep(2:100, 1:99), x = res.upper, symmetric = TRUE, dims = c(100, 100)),以避免多次复制和使用(可能)较小的对象