如何在R中构造一个并行版本的嵌套for循环来计算方阵的值,其中函数依赖于i和j? [英] How to construct in R a parallel version of nested for loop to compute values for a square matrix where the function is dependent on i and j?

查看:30
本文介绍了如何在R中构造一个并行版本的嵌套for循环来计算方阵的值,其中函数依赖于i和j?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个将i和j作为参数并返回单个值的函数,目前我还有一个嵌套循环,用于为方阵中的每个条目计算一个值。但从本质上讲,因为每个单独的值都可以并行计算。在这种情况下,我有没有办法申请LAPPLE?生成的矩阵必须为N X N,并且该函数依赖于i和j。谢谢

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

推荐答案

感谢您提出有趣的问题/用例。以下是使用future包(我是作者)的解决方案:

首先定义(*):

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
}

此函数不会对您的函数返回的数据类型做出任何假设,但使用默认的simplify = TRUE时,它将尝试简化返回的数据类型(类似于sapply()的工作方式)。

然后使用矩阵维度(**):

matrixRowLength <- 5
matrixColLength <- 5
dim <- c(matrixRowLength, matrixColLength)

和函数:

slow_fun <- function(i, j, ..., a = 1.0) {
  Sys.sleep(0.1)
  a * i + j
}

您可以为所有元素运行计算slow_fun(i, j, a = 10)

y <- future_array_call(dim, FUN = slow_fun, a = 10)

若要在本地计算机上并行执行此操作,请使用:

library("future")
plan(multiprocess)
y <- future_array_call(dim, FUN = slow_fun, a = 10)

在计算机群集上(您可以使用SSH密钥身份验证对其进行SSH访问),使用:

library("future")
plan(cluster, workers = c("machine1", "machine2"))
y <- future_array_call(dim, FUN = slow_fun, a = 10)

脚注:

(*)如果您想知道它是如何工作的,只需将future::future_lapply()语句替换为常规的lapply()

(**)future_array_call(dim, FUN)应适用于任何length(dim),而不只适用于两个(=矩阵)。

这篇关于如何在R中构造一个并行版本的嵌套for循环来计算方阵的值,其中函数依赖于i和j?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆