3

4次元配列があり、入力の関数である値をスロットに入力したいと思います。ここでフォーラムを検索したところ、関数「outer」は2x2行列には役立ちますが、一般的な多次元配列には適用できないことがわかりました。次のコードよりも効率的にRでこれを達成できるものはありますか?

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.
      }   
    }
  }
}

よろしくお願いします。

4

1 に答える 1

3

編集; これが、さらに高速なソリューションになると思います。提供したとおりに事前定義された K があることを前提としています。K[] <-コンストラクトを使用して、データフレーム環境で計算された値を挿入します。割り当ての LHS で角括弧を使用すると、K の構造が保持され、ベクトル化され、自己文書化されていると思います。

dfm <- expand.grid(x1=1:2,x2=1:2,y1=1:2,y2=1:2) 
K[] <- with(dfm, x1*y2 - sin(x2*y1 ) )

提供される最初のソリューション: インデックス x1、x2、y1、y2 と使用できる値を持つ data.frame またはマトリックスを作成できる場合: K[cbind(index-vectors)] <- 値の構築:

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
于 2012-05-14T19:07:18.697 に答える