获取 foreach 将其返回值存储在 3d 数组中

问题描述 投票:0回答:1

我有一个返回 (numVals x N) 数组/矩阵的函数。该函数需要评估 K 次。我的目标是将所有结果存储在包含形状为 c(numVals, N, K) 的双精度数的 R 数组中。

我无法为 .combine (或 foreach 的其他参数)找到合适的参数,以使其返回值采用正确的格式。我意识到我可以继续并稍后重塑 foreach 返回的 2d,但我遇到了内存限制(并且我不确定我是否可以在没有任何内存开销的情况下就地重塑。

我正在寻找的解决方案可以是 foreach (或与 dopar 兼容的类似函数)输出 3d 或重塑为正确的格式,而无需创建另一个内存占用与结果一样大的对象。

这是一个代码片段:

rm(list = ls())
library(doParallel)
library(doRNG)
registerDoParallel(cores = 3)
registerDoRNG(12345)

run_tasks <- function(k, N, numVals) {
  return(matrix(runif(numVals * N), numVals, N))
}

K <- 10000
N <- 40
numVals <- 10

# Run the simulation
results <-
  foreach(k = 1:K, .combine = rbind) %dorng% run_tasks(k, N, numVals)

# Desired output format
# results <- array(NA, c(numVals, N, K))
r multidimensional-array foreach doparallel
1个回答
0
投票

根本不要使用

.combine
,然后再制作
array
。默认情况下,
foreach
以列表形式返回结果,
.combine
只是一个方便的参数。

> results <- foreach(k = 1:K) %dorng% run_tasks(k, N, numVals)
> A <- array(unlist(results), dim=c(numVals, N, K))
> dim(A)
[1]  10  40 10000
> all.equal(A[,,1], results[[1]])
[1] TRUE
© www.soinside.com 2019 - 2024. All rights reserved.