Search for a dimensional index in a multidimensional array in R

I look at a 3-dimensional matrix M: M<-dim(3,3,3)

I want to find an effective way to populate M with the following rule: M [i, j, k] = i / 10 + j ^ 2 + sqrt (k), ideally, without having to write a loop using for statemenet.

For clarification, there is an easy way to do this if M is 2-dimensional. If I wanted M [i, j] = i / 10 + j ^ 2, then I could just do M<-row(M)/10 + col(M)*col(M)

Is there something equivalent for 3-dimensional or massive arrays?

+6
source share
4 answers

@James's answer is better, but I think the narrow answer to your question (multidimensional equivalent of row()/col() ) is slice.index ...

 M<- array(dim=c(3,3,3)) slice.index(M,1)/10+slice.index(M,2)^2+sqrt(slice.index(M,3)) 

It would be nice if someone (me or someone else) placed an offer on the r-devel list to record "See also" on ?row / ?col ... with ?col ...

Alternatively (similar to @flodel's new answer):

 d <- do.call(expand.grid,lapply(dim(M),seq)) ## create data.frame of indices v <- with(d,Var1/10+Var2^2+sqrt(Var3)) ## default names Var1, ... Varn dim(v) <- dim(M) ## reshape into array 
+7
source

How about using nested outer s?

 outer(1:3/10,outer((1:3)^2,sqrt(1:3),"+"),"+") , , 1 [,1] [,2] [,3] [1,] 2.1 5.1 10.1 [2,] 2.2 5.2 10.2 [3,] 2.3 5.3 10.3 , , 2 [,1] [,2] [,3] [1,] 2.514214 5.514214 10.51421 [2,] 2.614214 5.614214 10.61421 [3,] 2.714214 5.714214 10.71421 , , 3 [,1] [,2] [,3] [1,] 2.832051 5.832051 10.83205 [2,] 2.932051 5.932051 10.93205 [3,] 3.032051 6.032051 11.03205 
+4
source

You can also use arrayInd :

 M <- array(dim = c(3, 3, 3)) foo <- function(dim1, dim2, dim3) dim1/10 + dim2^2 + sqrt(dim3) idx <- arrayInd(seq_along(M), dim(M), useNames = TRUE) M[] <- do.call(foo, as.data.frame(idx)) 

I believe that this approach has the potential for less typing as the number of dimensions increases.

+2
source

Do it from the ground up, so to speak.

  i <- rep(1:3, times=3*3) j <- rep(1:3 , times= 3, each=3) k <- rep(1:3 , each= 3*3) M <- array( i/10 + j^2 + sqrt(k), c(3, 3, 3)) M 
+1
source

All Articles