jeudi 23 juin 2016

Speed up loops and condition with R

I would like to speed up this code in R.

The input is an array 3x3x3 containing integer number and based on the neighbors, if they are zero, replace them for the respective number.

The output is the array "mask_roi" with the new values.

###### 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_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 = 2,dim = c(3,3,3)))

}

for (i in 1:(nrow(image_melted_non_zeros))){      
  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]
    value_nei = image_melted[nei_number,4] ## nei value

    if(value_nei == 0){   
      xx = image_melted[nei_number,1]
      yy = image_melted[nei_number,2]
      zz = image_melted[nei_number,3] 

      mask_roi[xx,yy,zz] = value_vozel
    }
  }
}

I need do this for 256x256x256 array not 3x3x3.

Thanks a lot!

Aucun commentaire:

Enregistrer un commentaire