如何在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?
本文介绍了如何在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屋!
查看全文