[問題] for 迴圈的平行運算

看板R_Language作者 (5245566)時間10年前 (2015/10/21 19:51), 10年前編輯推噓0(008)
留言8則, 2人參與, 最新討論串1/2 (看更多)
[問題類型]: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) [軟體熟悉度]: 新手(沒寫過程式,R 是我的第一次) [問題敘述]: 目前有一個數學模型,每次要跑20秒,懲罰係數大約為16*16種組合 想利用版上所說的RMPI來優化程式,但我是用雙for迴圈來代入懲罰係數的 目前是想平行運算各組合,將各組合結果儲存到一個陣列, 再去找出最小的AIC [程式範例]: wn = seq(0.25,1,0.05) wn1 = seq(0.25,1,0.05) AIC0 = 10^6 for(i in 1:length(wn)){ for(j in 1:length(wn1)){ list[AIC,BIC] = Model(wn[i],wn1[j]); if(AIC < AIC0){ finalAIC = AIC finalBIC = BIC } } } [環境敘述]: Win7 32bit R3.2.2 [關鍵字]: Parallel Computing、RMPI -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.195.74.150 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1445428297.A.5AF.html 另外想請教一下這個錯誤要怎麼解決? Error in mpi.comm.spawn(slave = mpitask, slavearg = args, nslaves = count, : Other MPI error, error stack: RMPI不知道為何在我的電腦會出現這個錯誤 所以我就改用parallel這個函式庫 library(parallel) inputs <- 1:256 processInput <- function(i){ wn = seq(0.25,1,0.05) wn1 = seq(0.25,1,0.05) wnpair <- data.frame("wn0" = double(), "wn1" = double(), stringsAsFactors=FALSE) for(i in 1:length(wn)){ for(j in 1:length(wn1)){ wnpair[nrow(wnpair) + 1,] <- c(wn[i],wn1[j]) } } wnpair$wn0[i] * wnpair$wn1[i] } numCores <- detectCores() c1 <- makeCluster(numCores) results = parLapply(c1,inputs,processInput) stopCluster(c1) 所得出的results變成256個0.25 而不是兩兩相乘 版上各位大大可以教學一下嗎?

10/21 21:36, , 1F
沒有要跨電腦的話,就不須要用MPI
10/21 21:36, 1F

10/21 21:36, , 2F
直接看看parallel或snow等套件吧
10/21 21:36, 2F

10/21 21:39, , 3F
了解 parallel可以直接代入兩個參數嗎??
10/21 21:39, 3F

10/21 21:42, , 4F
應該不能吃兩個參數,但是你可以用expand.grid展開一個
10/21 21:42, 4F

10/21 21:43, , 5F
c(length(wn) * length(wn1), 2)的矩陣,裡面列出i,j的所
10/21 21:43, 5F

10/21 21:43, , 6F
有組合
10/21 21:43, 6F
感謝 有試了expand.grid 但不知道代入function後要如何分別用兩個參數 library(parallel) inputs <- 1:256 wn = seq(0.25,1,0.05) wn1 = seq(0.3,1,0.05) processInput <- function(i) { i$Var1 + i$Var2 } inputs <- expand.grid(wn,wn1) numCores <- detectCores() # results = mclapply(inputs, processInput, mc.cores = numCores) # the above won't work on Windows, but this will: cl <- makeCluster(numCores) results = parLapply(cl, inputs, processInput) stopCluster(cl) 會得到錯誤 Error in checkForRemoteErrors(val) : 2 nodes produced errors; first error: $ operator is invalid for atomic vectors ※ 編輯: tony255034 (123.195.74.150), 10/21/2015 22:28:29

10/22 00:58, , 7F
只丟一維的變數到第一個參數,在函數裡面用expand.grid
10/22 00:58, 7F

10/22 00:58, , 8F
的結果再展開成二維
10/22 00:58, 8F
文章代碼(AID): #1M9tn9Ml (R_Language)
討論串 (同標題文章)
文章代碼(AID): #1M9tn9Ml (R_Language)