6

たとえば、3 次元配列 M を見ています。M<-dim(3,3,3)

M[i,j,k] = i/10 + j^2 + sqrt(k)というルールで M を設定する効率的な方法を見つけたいと思います 。理想的には、ステートメネットでループを記述する必要はありませんfor

明確にするために、M が 2 次元の場合にこれを達成する簡単な方法があります。M[ i ,j] = i/10 + j^2が必要な場合は、次のことができます M<-row(M)/10 + col(M)*col(M)

3次元以上の配列に相当するものはありますか?

4

4 に答える 4

7

@ジェームズの答えはより良いですが、あなたの質問に対する狭い答え(多次元に相当するrow()/col())はslice.index...

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

誰か (私または他の誰か) がr-develリストに提案を投稿して、 / ...slice.indexの「関連項目」エントリを作成するとよいでしょう。?row?col

または(@ flodelの新しい回答に似ています):

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
于 2012-10-24T18:10:53.910 に答える
4

ネストされたouters を使用するのはどうですか?

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
于 2012-10-24T18:07:44.127 に答える
2

次のものも使用できます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))

このアプローチは、次元数が増えるにつれてタイピングが少なくなる可能性があると感じています。

于 2012-10-24T19:50:39.047 に答える
1

いわば「根底から」やっています。

 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
于 2012-10-24T19:45:31.107 に答える