我正在嘗試在 R 中學習并行性。我撰寫了一個代碼,其中我有一個 50*50 矩陣,從值 1 到 250000。對于矩陣中的每個元素,我正在尋找具有最低值的鄰居。鄰居也可以處于對角線位置。然后我用最低的鄰居替換元素本身。在我的計算機上運行此代碼所需的時間約為 4.5 秒。如果可以的話,有人可以幫助我使 for 回圈并行嗎?這是代碼片段
start_time <- Sys.time()
myMatrix <- matrix(1:250000, nrow=500) # a 500 * 500 matrix from 1 to 250000
indexBound <- function(row,col) { # this function is to check if the indexes are out of bound
if(row<0 || col <0 || row > 500 || col >500){
return (FALSE)
}
else{
return (TRUE)
}
}
for(row in 1:nrow(myMatrix)){
for(col in 1:ncol(myMatrix)){
li <- list()
if(indexBound(row-1,col-1)){
li <- c(li,myMatrix[row-1,col-1])
}
if(indexBound(row-1,col)){
li <- c(li,myMatrix[row-1,col])
}
if(indexBound(row-1,col 1)){
li <- c(li,myMatrix[row-1,col 1])
}
if(indexBound(row,col-1)){
li <- c(li,myMatrix[row,col-1])
}
if(indexBound(row-1,col 1)){
li <- c(li,myMatrix[row,col 1])
}
if(indexBound(row 1,col-1)){
li <- c(li,myMatrix[row 1,col-1])
}
if(indexBound(row 1,col)){
li <- c(li,myMatrix[row 1,col])
}
if(indexBound(row 1,col 1)){
li <- c(li, myMatrix[row 1,col 1])
}
min = Reduce(min,li) #find the lowest value from the list
myMatrix[row,col] = min
}
}
end_time <- Sys.time()
end_time - start_time
謝謝您的答復。
uj5u.com熱心網友回復:
您的腳本將生成一個所有元素都等于 2 的矩陣。如果這不是您的意圖,您應該創建一個副本myMatrix以在構建時使用li(在if陳述句中)。
我意識到這可能是一個探索并行化的人為例子,但對于 R,通常最好首先關注矢量化。向量化后,此操作可能足夠快,以至于并行化實際上可能由于開銷而變慢。例如,這是一個使用填充矩陣的矢量化解決方案(這不會給出所有 2,并且它仍然不包括min計算中的當前單元格):
library(matrixStats)
system.time({
idxShift <- expand.grid(rep(list(-1:1), 2))[-5,] # don't include the current cell (0, 0)
myMatrix <- matrix(nrow = 502, ncol = 502)
myMatrix[2:501, 2:501] <- matrix(1:250000, nrow = 500)
myMatrix <- matrix(rowMins(mapply(function(i,j) c(myMatrix[2:501 i, 2:501 j]), idxShift$Var1, idxShift$Var2), na.rm = TRUE), nrow = 500)
})
user system elapsed
0.03 0.00 0.03
使用以下命令將其與相同矢量化代碼的并行版本進行比較future.apply:
library(future.apply)
plan(multisession)
system.time({
idxShift <- expand.grid(rep(list(-1:1), 2))[-5,]
myMatrix <- matrix(nrow = 502, ncol = 502)
myMatrix[2:501, 2:501] <- matrix(1:250000, nrow = 500)
myMatrix <- matrix(rowMins(future_mapply(function(i,j) c(myMatrix[2:501 i, 2:501 j]), idxShift$Var1, idxShift$Var2), na.rm = TRUE), nrow = 500)
})
future:::ClusterRegistry("stop")
user system elapsed
0.10 0.05 2.11
如果我沒有搞砸一些事情,并行解決方案會更慢,甚至不包括plan(multisession)在計時中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/337953.html
上一篇:為await函式創建另一個執行緒
