[R] How to apply a function to a multidimensional array based on its indices

Rui Barradas ruipbarradas at sapo.pt
Mon May 14 18:04:20 CEST 2012


Hello,

Try

K <- array(0,dim=c(2,2,2,2)) #dimensions will be much larger
for(x1 in 1:2){
  for(y1 in 1:2)  {
    for(x2 in 1:2)    {
      for(y2 in 1:2)      {
        K[x1,y1,x2,y2] <-  x1*y2 - sin(x2*y1) #this is just a dummy
function.
      }  
    }
  }
}


fun <- function(x){
	x1 <- x[1]  # these are
	x2 <- x[2]  # not
	y1 <- x[3]  # really
	y2 <- x[4]  # needed
	x1*y2 - sin(x2*y1) # could have used x[1], etc
}


res <- apply(expand.grid(1:2, 1:2, 1:2, 1:2), 1, fun)
dim(res) <- c(2, 2, 2, 2)
res

all.equal(K, res)
[1] TRUE

See the help pages
?expand.grid
?apply


Hope this helps,

Rui Barradas

math_daddy wrote
> 
> Hello. I have a 4 dimensional array and I want to fill in the slots with
> values which are a function of the inputs. Through searching the forums
> here I found that the function "outer" is helpful for 2x2 matrices but
> cannot be applied to general multidimensional arrays. Is there anything
> which can achieve, more efficiently than the following code, the job I
> want?
> 
> K <- array(0,dim=c(2,2,2,2)) #dimensions will be much larger
> for(x1 in 1:2)
> {
>   for(y1 in 1:2)
>   {
>     for(x2 in 1:2)
>     {
>       for(y2 in 1:2)
>       {
>         K[x1,y1,x2,y2] <- x1*y2 - sin(x2*y1) #this is just a dummy
> function.
>       }   
>     }
>   }
> }
> 
> Thank you in advance for any help.
> 


--
View this message in context: http://r.789695.n4.nabble.com/How-to-apply-a-function-to-a-multidimensional-array-based-on-its-indices-tp4629940p4629955.html
Sent from the R help mailing list archive at Nabble.com.



More information about the R-help mailing list