[R] Speeding indexing and sub-sectioning of 3d array

Swidan, Firas swidanf at janelia.hhmi.org
Wed Aug 9 16:36:49 CEST 2006


Hi,

I am having a problem with a very slow indexing and sub-sectioning of a 3d
array:

> dim(arr)
[1] 245 175 150

For each point in the array, I am trying to calculate the mean of the values
in its surrounding:


mean( arr[ (i - radius):(i + radius),
                                (j - radius):(j + radius),
                                (k - radius):(k + radius)] )

Putting that code in 3 for loops

calculateKMedian <- function( arr, radius){

  for( i in (radius + 1):(dim(arr)[1] - radius - 1) ){
    for( j in (radius + 1):(dim(arr)[2] - radius - 1) )
      for( k in (radius + 1):(dim(arr)[3] - radius - 1) ){


        mediansArr <- mean( arr[ (i - radius):(i + radius),
                                (j - radius):(j + radius),
                                (k - radius):(k + radius)] )

      }
  }
  return(mediansArr)
}

Results in a very slow run:

> system.time( calculateKMedian( a, 3))
[1] 423.468   0.096 423.631   0.000   0.000

If I replace 

        mediansArr <- mean( arr[ (i - radius):(i + radius),
                                (j - radius):(j + radius),
                                (k - radius):(k + radius)] )

With an access to the (I,j,k) cell's value

 mediansArr <- arr[i,j,k]

The running time decreases to

> system.time( calculateKMedian( a, 3))
[1] 14.821  0.005 14.829  0.000  0.000



But 14 seconds are still pretty expensive for just scanning the array.

Is there anything I can do to speed the indexing and the sub-sectioning of
the 3d array in this case?

Thanks for the help,
Firas.



More information about the R-help mailing list