如何在R中构造嵌套for循环的并行版本,以计算函数依赖于i和j的平方矩阵的值?

如何在R中构造嵌套for循环的并行版本,以计算函数依赖于i和j的平方矩阵的值?,r,for-loop,parallel-processing,iterator,nested-loops,R,For Loop,Parallel Processing,Iterator,Nested Loops,我有一个函数,它以I和j为参数,并返回一个值。目前,我有一个嵌套循环,用于计算方阵中每个条目的值。但本质上,因为每个单独的值都可以并行计算。在这种情况下,我有没有办法应用lapply?结果矩阵必须为nxn,且函数依赖于i和j。谢谢 for ( i in 1:matrixRowLength ) { for ( j in 1:matrixColLength ) { result_matrix[i,j] <- function(i,j) } } for(1中

我有一个函数,它以I和j为参数,并返回一个值。目前,我有一个嵌套循环,用于计算方阵中每个条目的值。但本质上,因为每个单独的值都可以并行计算。在这种情况下,我有没有办法应用lapply?结果矩阵必须为nxn,且函数依赖于i和j。谢谢

for ( i in 1:matrixRowLength ) {
     for ( j in 1:matrixColLength ) {
             result_matrix[i,j] <- function(i,j) } }
for(1中的i:matrixRowLength){
对于(1中的j:matrixColLength){

结果_矩阵[i,j]foreach
包中有一个嵌套运算符,在为循环并行嵌套
时非常有用。下面是一个示例:

library(doSNOW)
cl <- makeSOCKcluster(3)
registerDoSNOW(cl)

matrixRowLength <- 5
matrixColLength <- 5
fun <- function(i, j) 10 * i + j

result_matrix.1 <-
  foreach(j=1:matrixColLength, .combine='cbind') %:% 
    foreach(i=1:matrixRowLength, .combine='c') %dopar% {
      fun(i, j)
    }
库(doSNOW)

cl感谢您提出了一个有趣的问题/用例。下面是一个使用该软件包的解决方案(我是作者):

首先,定义(*):

和功能:

slow_fun <- function(i, j, ..., a = 1.0) {
  Sys.sleep(0.1)
  a * i + j
}
要在本地计算机上并行执行,请使用:

library("future")
plan(multiprocess)
y <- future_array_call(dim, FUN = slow_fun, a = 10)
库(“未来”)
计划(多进程)

y取决于你的计算是什么。矩阵只是一个有维度的向量,所以你可以做lappy(矩阵(1:4,nrow=2),函数(i)i)
例如,应用于每个值。您的编辑没有太多说明-向量可以折叠回矩阵没有问题-
x函数在进行一些计算后返回一个值,结果矩阵最初是一个填充了零的方阵。我明白这一点。但是函数的返回值依赖于i和j吗具体来说,像
i+j+x
future_array_call <- function(dim, FUN, ..., simplify = TRUE) {
  args <- list(...)
  idxs <- arrayInd(seq_len(prod(dim)), .dim = dim)
  idxs <- apply(idxs, MARGIN = 1L, FUN = as.list)
  y <- future::future_lapply(idxs, FUN = function(idx_list) {
    do.call(FUN, args = c(idx_list, args))
  })
  if (simplify) y <- simplify2array(y)
  dim(y) <- dim
  y
}
matrixRowLength <- 5
matrixColLength <- 5
dim <- c(matrixRowLength, matrixColLength)
slow_fun <- function(i, j, ..., a = 1.0) {
  Sys.sleep(0.1)
  a * i + j
}
y <- future_array_call(dim, FUN = slow_fun, a = 10)
library("future")
plan(multiprocess)
y <- future_array_call(dim, FUN = slow_fun, a = 10)
library("future")
plan(cluster, workers = c("machine1", "machine2"))
y <- future_array_call(dim, FUN = slow_fun, a = 10)