【发布时间】:2016-10-26 08:11:17
【问题描述】:
我想在 R 中加速这段代码。
输入是一个包含整数的 3x3x3 数组,并基于邻居,如果它们为零,则将它们替换为相应的数字。
输出是带有新值的数组“mask_roi”。
###### Start here
list_neig = array(0, dim = c(3,3,3))
mask_roi = array(sample(c(0,1,2),27,replace=T), dim = c(3,3,3))
values_mask = array(1:27, dim = c(3,3,3))
values_mask_melted = melt(values_mask, varnames=c("x","y","z"))
### Tranform the 3D Matrix in a data.table wit 4 columns position and value
image_melted <- melt(mask_roi, varnames=c("x","y","z")) # 4 columns: x, y, z, value
image_melted$box = rownames(image_melted)
image_melted_non_zeros<-image_melted[!(image_melted$value==0),]
box_neigbors = vector("list", nrow(image_melted))
for (i in 1:(nrow(image_melted_non_zeros))){
cat(i,"\n")
x = image_melted_non_zeros[i,1]
y = image_melted_non_zeros[i,2]
z = image_melted_non_zeros[i,3]
box_neigbors[[image_melted_non_zeros[i,5]]] <- list(nearestNeighbors(values_mask, elem = c(x,y,z), dist = 1,dim = c(3,3,3)))
}
我已经完成了“box_neighbors”向量,只是将它包含在此处以说明如何获取它,我们需要从这里到结束更快。这个想法是,检查所有不同于零的体素并检查他的所有邻居。如果他的邻居为零,他将具有相同的值,如果不为零,则保持原来的值。
for (i in 1:(nrow(image_melted_non_zeros))){
cat(i,"\n")
x = image_melted_non_zeros[i,1]
y = image_melted_non_zeros[i,2]
z = image_melted_non_zeros[i,3]
number_of_nei = length(box_neigbors[[image_melted_non_zeros[i,5]]][[1]] )
value_vozel = mask_roi[x,y,z] # it will give this new value
for (j in 1:number_of_nei){
nei_number = box_neigbors[[image_melted_non_zeros[i,5]]][[1]][j]
xx = image_melted[nei_number,1]
yy = image_melted[nei_number,2]
zz = image_melted[nei_number,3]
value_nei = mask_roi[xx,yy,zz]
if(value_nei == 0){
mask_roi[xx,yy,zz] = value_vozel
}
}
}
我需要为 256x256x256 阵列而不是 3x3x3 执行此操作。
非常感谢!
nearestNeighbors <- function(ary, elem, dist, dims){
usedims <- mapply(function(el, d) {
seq(max(1, el - dist), min(d, el + dist))
}, elem, dims, SIMPLIFY=FALSE)
df <- as.matrix(do.call('expand.grid', usedims))
ndist <- sqrt(apply(df, 1, function(x) sum((x - elem)^2)))
ret <- df[which(ndist > 0 & ndist <= dist),,drop = FALSE]
return(ary[ret])
}
【问题讨论】:
-
你从哪个包获得
melt? -
@BryanGoggin,
melt来自reshape。 -
你能帮我解决这个问题吗@r2evans ?你就是那个家伙!
-
您是否分析过您的任何代码以找到最大的罪魁祸首?虽然系统的
system.time()捕获会给你一些东西,但我推荐Rprof(example usage) 或Hadley 的新分析工具profvis。 -
请使用 set.seed 使随机数可重现,显示相应的预期输出并解释(用自然语言,而不是代码)它是如何派生的。
标签: r for-loop parallel-processing data.table plyr