首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免R循环并与snow并行化

避免R循环并与snow并行化
EN

Stack Overflow用户
提问于 2017-06-15 04:50:39
回答 1查看 125关注 0票数 1

我有一个大的循环,这将花费太长的时间(~100天)。我希望用snow库来加快速度,但我不太擅长apply语句。这只是循环的一部分,但如果我能弄清楚这一部分,其余的应该很简单。我可以使用一堆apply语句或循环,但一个apply语句使用一个函数来获取对象'p‘将是理想的。

原始数据

代码语言:javascript
复制
dim(m1)   == x x    # x >>> 0
dim(m2)   == y x    # y >>> 0, y > x, y > x-10
dim(mout) == x x    
thresh    == x-10   #specific to my data, actual number probably unimportant
len(v1)   == y      #each element is a random integer, min==1, max==thresh 
len(v2)   == y      #each element is a random integer, min==1, max==thresh 

原始循环

代码语言:javascript
复制
p <- rep(NA,y)
for (k in 1:y){
    mout <- m1 * matrix(m2[k,],x,x)
    mout <- mout/sum(mout)

    if (v1[k] < thresh + 1){
        if(v2[k] < thresh + 1){
            p[k] <- out[v1[k],v2[k]]
        }
        if(v2[k] > thresh){
            p[k] <-  sum(mout[v1[k],(thresh+1):x])
        }
    }

    #do stuff with object 'p'
}
EN

回答 1

Stack Overflow用户

发布于 2017-06-16 22:01:20

代码语言:javascript
复制
library(snow)
dostuff <- function(k){
    #contents of for-loop
    mout <- m1 * matrix(m2[k,],x,x)
    mout <- mout/sum(mout)

    if (v1[k] < thresh + 1){
        if(v2[k] < thresh + 1){
            p <- out[v1[k],v2[k]]
        }
        if(v2[k] > thresh){
            p <-  sum(mout[v1[k],(thresh+1):x])
        }
    }

    #etc etc

    return(list(p,
                other_vars))
}

exports = c('m1',
            'm2',
            'thresh',
            'v1',
            'x' ,
            'v2')
cl = makeSOCKcluster(4)
clusterExport(cl,exports)

loop <- as.array(1:y)
out <- parApply(cl,loop,1,dostuff)

p <- rep(NA,y)
for(k in 1:y){
    p[k]          <- out[[k]][[1]]
    other_vars[k] <- out[[k]][[2]]
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44554521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档