看板 R_Language 關於我們 聯絡資訊
[問題類型]: 程式諮詢(我想用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 而不是兩兩相乘 版上各位大大可以教學一下嗎?
Wush978: 沒有要跨電腦的話,就不須要用MPI 10/21 21:36
Wush978: 直接看看parallel或snow等套件吧 10/21 21:36
tony255034: 了解 parallel可以直接代入兩個參數嗎?? 10/21 21:39
Wush978: 應該不能吃兩個參數,但是你可以用expand.grid展開一個 10/21 21:42
Wush978: c(length(wn) * length(wn1), 2)的矩陣,裡面列出i,j的所 10/21 21:43
Wush978: 有組合 10/21 21:43
感謝 有試了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
Wush978: 只丟一維的變數到第一個參數,在函數裡面用expand.grid 10/22 00:58
Wush978: 的結果再展開成二維 10/22 00:58