Создать матрицу для заполнения без указания ее размера - PullRequest
0 голосов
/ 22 февраля 2019

Я работаю над алгоритмом, в котором я выполняю действие итеративно, и в каждом повторении я получаю последовательность значений (вектор).Я хотел бы сохранить этот вектор внутри матрицы, например, в виде столбца, но проблема в том, что я априори не знаю, сколько итераций будет сделано алгоритмом.Насколько я знаю, в R нужно указать размерность матрицы.Есть идеи, как это решить?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Когда известна длина вектора

Вот решение, в котором вы создаете пустую матрицу M известных размеров (количество строк равно длине вектора (lVector) и количеству столбцов (nCols)ты выбираешь себя).После nCols (когда матрица заполнена) вы записываете его на диск с уникальным идентификатором.

# These parameters are known
lVector <- 10
nCols <- 1e4
# Create matrix
M <- matrix(nrow = lVector, ncol = nCols)
iter <- 0

# This is unknown before
nIterations <- 1e5 + 10

# Perform iterations
for(i in seq_len(nIterations)) {
    iter <- iter + 1

    # Perform simulation and write result to a matrix column
    M[, iter] <- sample(100, 10)

    if (iter == nCols) {
        # Write result to disc
        saveRDS(M, paste0("result_", i, ".RDS"))
        # Reset counter
        iter <- 0
        # Create new empty matrix
        M <- matrix(nrow = lVector, ncol = nCols)
    }
}
# Write last 10 iterations to a disc (they didn't reach 1e4)
saveRDS(M[, 1:iter], paste0("result_", i, ".RDS"))

При этом будут записываться матрицы (result_10000.RDS, result_20000.RDS, ...)


Когда длина вектора неизвестна

Здесь вы можете создать пустой список длиной lList, а после lList итераций записать его на диск и заново создать новый список.

# These parameters are known
lList <- 1e4
iter <- 0
# Create empty list
L <- rep(list(NA), lList)

# This is unknown before
nIterations <- 1e5 + 10

# Perform iterations
for(i in seq_len(nIterations)) {
    iter <- iter + 1
    L[[iter]] <- sample(100, 10)
    if (iter == lList) {
        saveRDS(L, paste0("result_", i, ".RDS"))
        iter <- 0
        L <- rep(list(NA), lList)
    }
}
saveRDS(L[1:iter], paste0("result_", i, ".RDS"))
0 голосов
/ 22 февраля 2019

Создать пустой список.На каждой итерации в списке есть еще один элемент неизвестной длины.

res <- list()
unknown_iterations <- 10
for (k in 1:unknown_iterations){
  res[[length(res) + 1]] <- sample(1:k, k)
}
res
unlist(res)

Затем вы можете применить желаемую форму к вашим данным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...