Объединить список матриц в big.matrix

У меня есть список больших (35000 x 3) матриц в R, и я хочу объединить их в одну матрицу, но это будет около 1 миллиарда строк в длину и будет превышать максимальный размер объекта в R.

Пакет bigmemory допускает большие матрицы, но , похоже, не поддерживает rbind положить несколько матриц вместе.

Есть ли какой-то другой пакет или метод, который поддерживает создание очень большой матрицы из меньших матриц?

Кроме того, прежде чем вы спросите, это не проблема ОЗУ, просто ограничение R даже на 64-битной R.

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))

Не совсем ответ, но немного больше, чем комментарий: вы уверены, что не можете сделать это грубой силой? R теперь имеет длинные векторы (начиная с версии 3.0.0; вопрос, на который вы ссылаетесь, относится к версии 2.14.1 R): с этой страницы

Массивы (включая матрицы) могут основываться на длинных векторах при условии, что каждое из их измерений не превышает 2^31 - 1: таким образом, нет одномерных длинных массивов.

в то время как базовый атомный вектор может доходить до 2^52 -1 элементов ("в теории... пределы адресного пространства современных процессоров и ОС будут намного меньше"). Это означает, что в принципе вы должны быть в состоянии создать матрицу, которая ((2^31)-1)/1e9 = 2,1 миллиарда строк в длину; поскольку максимальный "длинный" размер объекта составляет около 10^15 (т. е. буквально миллионы миллиардов), матрица из 1 миллиарда строк и 3 столбцов (теоретически) не должна быть проблемой.

Другие вопросы по тегам