【发布时间】:2015-09-25 13:37:12
【问题描述】:
我有一个数组 data = array[1:50,1:50,1:50] 里面的值是-1, 1之间的实数。
“数据”可以被视为 50x50x50 的立方体。
我需要根据这个方程创建一个相关矩阵(去除所有零)=>
值 = (x+y)-|x-y|并且矩阵大小是可能组合的 2 倍 (50x50x50)*((50x50x50)-1)/2 = 7.812.437.500 这 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...
有更快的方法吗?
谢谢
【问题讨论】:
-
请给我们一个小的reproducible example(例如,使用 3x3x3 数组)来处理并显示预期的输出。如果找不到矢量化解决方案(可疑),您应该使用 Rcpp 执行此操作(即,在编译后的代码中执行循环)。
-
无法运行您当前生成
data的代码,因为找不到S。 -
大家好,我已经编辑了这篇文章并提供了更多解释。谢谢
标签: arrays r performance loops parallel-processing