R语言并行计算如何输出矩阵或三维数组?(从Matlab转用R)
在R中用foreach实现类似Matlab parfor的矩阵/数组并行输出
先配置并行环境
和Matlab的parpool类似,R需要先注册并行集群,这里用doParallel包实现:
# 安装依赖包(首次运行执行) install.packages(c("doParallel", "foreach", "abind")) # 加载包 library(doParallel) library(foreach) library(abind) # 注册并行集群,示例用4个核心,可根据机器调整 cl <- makeCluster(4) registerDoParallel(cl)
实现100×2矩阵Y(对应Matlab中的Y)
利用foreach的.combine参数指定rbind,直接将每个迭代返回的向量按行拼接成矩阵:
Y <- foreach(i = 1:100, .combine = 'rbind') %dopar% { rnorm(2) # 每次返回1×2的随机向量 }
实现10×5×100三维数组X(对应Matlab中的X)
foreach默认返回列表,先收集每个迭代生成的10×5矩阵,再通过abind工具沿第三维度合并:
# 先收集所有10×5的矩阵到列表 X_list <- foreach(i = 1:100) %dopar% { matrix(rnorm(10*5), nrow = 10, ncol = 5) } # 沿第三维度合并成三维数组 X <- abind(X_list, along = 3)
如果不想额外安装abind包,也可以手动重构数组:
X <- array(unlist(X_list), dim = c(10, 5, 100))
一次并行循环同时生成X和Y
和Matlab的parfor逻辑一致,在一个循环里同时处理两个变量,最后分别提取合并:
results <- foreach(i = 1:100) %dopar% { list( X_slice = matrix(rnorm(10*5), 10, 5), Y_row = rnorm(2) ) } # 提取并合并X X <- abind(lapply(results, function(x) x$X_slice), along = 3) # 提取并合并Y Y <- do.call(rbind, lapply(results, function(x) x$Y_row))
最后记得关闭并行集群
stopCluster(cl)
内容的提问来源于stack exchange,提问作者user0131
相关产品推荐
相关产品推荐

