2

我在 R 中有一个大型 (35000 x 3) 矩阵列表,我想将它们组合成一个矩阵,但它的长度约为 10 亿行,并且会超过 R 中的最大对象大小

bigmemory包允许更大的矩阵,但似乎支持rbind将多个矩阵放在一起。

是否有其他一些包或技术支持从较小的矩阵创建一个非常大的矩阵?

同样在您问这不是 RAM 问题之前,即使在 64 位 R 上也只是 R 限制。

4

2 回答 2

2

你可以用一个循环来实现它:

library(bigmemory)

## Reproducible example
mat <- matrix(1, 50e3, 3)
l <- list(mat)
for (i in 2:100) {
  l[[i]] <- mat
}

## Solution
m <- ncol(l[[1]])  ## assuming that all have the same number of columns
n <- sum(sapply(l, nrow))

bm <- big.matrix(n, m)
offset <- 0
for (i in seq_along(l)) {
  mat_i <- l[[i]]
  n_i <- nrow(mat_i)
  ind_i <- seq_len(n_i) + offset
  bm[ind_i, ] <- mat_i
  offset <- offset + n_i
}

## Verif
stopifnot(offset == n, all(bm[, 1] == 1))
于 2018-05-25T22:23:23.887 回答
1

不完全是一个答案,而不仅仅是一个评论:你确定你不能通过蛮力做到这一点吗?R 现在有长向量(从 3.0.0 版开始;您链接到的问题是指 R 2.14.1 版):从此页面

数组(包括矩阵)可以基于长向量,前提是它们的每个维度最多为 2^31 - 1:因此不存在一维长数组。

而底层原子向量最多可以包含 2^52 -1 个元素(“理论上……当前 CPU 和操作系统的地址空间限制会小得多”)。这意味着您原则上应该能够创建一个((2^31)-1)/1e9长达 = 21 亿行的矩阵;由于最大“长”对象大小约为 10^15(即数百万),因此(理论上)10 亿行和 3 列的矩阵应该不是问题。

于 2018-05-25T18:31:06.760 回答