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

David Winsemius dwinsemius at comcast.net
Mon May 14 19:22:11 CEST 2012


On May 14, 2012, at 10:09 AM, 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.
>      }
>    }
>  }
> }
>

If you can create a data.frame or matrix that has the indices  
x1,x2,y1,y2 and the values you can use the:  K[cbind(index-vectors)]  
<- values construction:

mtx<- data.matrix( expand.grid(x1=1:2,x2=1:2,y1=1:2,y2=1:2) )
K[mtx] <- apply(mtx, 1, function(x) x["x1"]*x["y2"] -  
sin(x['x2']*x['y1']) )
#----------------
 > K
, , 1, 1

          [,1]       [,2]
[1,] 0.158529 0.09070257
[2,] 1.158529 1.09070257

, , 2, 1

            [,1]     [,2]
[1,] 0.09070257 1.756802
[2,] 1.09070257 2.756802

, , 1, 2

          [,1]     [,2]
[1,] 1.158529 1.090703
[2,] 3.158529 3.090703

, , 2, 2

          [,1]     [,2]
[1,] 1.090703 2.756802
[2,] 3.090703 4.756802


> 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-tp4629940.html
> Sent from the R help mailing list archive at Nabble.com.
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list