我有一個數組數據=陣列[1:50,1:50,1:50]數組R是值內是-1之間的實數,1優化循環使用並行
「數據」能視爲立方體50x50x50。
我需要創建基於此方程=>
值=(X + Y)的相關矩陣(除去全零) - | X-Y |並且矩陣大小是可能組合(50×50×50)×((50×50×50)-1)/ 2 = 7.812.437.500這2倍=相關矩陣的2倍。
我這樣做:
比方說我們的3x3x3:
arr = array(rnorm(10), dim=c(3,3,3))
data = data.frame(array(arr))
data$voxel <- rownames(data)
#remove zeros
data<-data[!(data[,1]==0),]
rownames(data) = data$voxel
data$voxel = NULL
#######################################################################################
#Create cluster
no_cores <- detectCores() #- 1
clus <- makeCluster(no_cores)
clusterExport(clus, list("data") , envir=environment())
clusterEvalQ(clus,
compare_strings <- function(j,i) {
value <- (data[i,]+data[j,])-abs(data[i,]- data[j,])
pair <- rbind(rownames(data)[j],rownames(data)[i],value)
return(pair)
})
i = 0 # start 0
kk = 1
table <- data.frame()
ptm <- proc.time()
while(kk<nrow(data)) {
out <-NULL
i = i+1 # fix row
j = c((kk+1):nrow(data)) # rows to be compared
#Apply the declared function
out = matrix(unlist(parRapply(clus,expand.grid(i,j), function(x,y) compare_strings(x[1],x[2]))),ncol=3, byrow = T)
table <- rbind(table,out)
kk = kk +1
}
proc.time() - ptm
結果是data.frame:
v1 v2 v3
1 2 2.70430114250358
1 3 0.199941717684129
... up to 351 rows
但是這將需要數天...
另外,我想創建一個這種關聯矩陣:
1 2 3...
1 1 2.70430114250358
2 2.70430114250358 1
3...
有沒有更快的方法來做到這一點?
感謝
請給我們一個小[再現的示例](http://stackoverflow.com/a/5963610/1412059)(例如,用3x3x3的陣列)與和顯示工作預期的產出。如果無法找到矢量化解決方案(可疑),則應使用Rcpp執行此操作(即,在編譯代碼中執行循環)。 – Roland
由於無法找到「S」,因此您當前生成'data'的代碼無法運行。 – Heroka
大家好,我已經編輯了一些更多解釋的帖子。謝謝 – DemetriusRPaula