【问题标题】:Create a matrix to be filled in without specifying its dimension创建要填充的矩阵而不指定其维度
【发布时间】:2019-02-22 08:26:20
【问题描述】:

我正在研究一种算法,在该算法中我迭代地执行一个动作,并且在每次重复中我获得一系列值(一个向量)。我想将此向量保留在矩阵中,例如作为列,但问题是我不知道该算法将进行多少次迭代。据我所知,在 R 中,您必须指定矩阵的维度。 知道如何解决吗?

【问题讨论】:

  • 看看rbind()cbind()。您可以在每次迭代中添加新的行/列。
  • 可以使用列表并在每次迭代中保存 1 个孩子,然后在知道最终大小后收集所有内容

标签: r loops matrix


【解决方案1】:

当向量长度已知时

这是一个解决方案,您可以创建一个已知维度的空矩阵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"))

【讨论】:

  • 如果我们不知道每次迭代时向量的长度?在我的例子中是在 LASSO 回归中获得的系数,因此在每一步中,非零系数的数量可能不同。
  • @RamiroScrolli 更新了我的答案。在这种情况下,您可以使用列表。
【解决方案2】:

创建一个空列表。 在每次迭代中,列表都会多出一个长度未知的元素。

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

然后你可以将你想要的形状应用到你的数据中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 2021-06-14
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多