2

私が配列を持っているとしましょう

TestArray=array(1:(3*3*4),c(3,3,4))

以下ではTestArray[i,,]、 、 TestArray[,j,]、をそれぞれTestArray[,,k]x=iy=jおよびz=kサブセットと呼びます。この特定の例では、インデックスijは 1 から 3 およびk1 から 4 に移動できます。

ここで、この 3 次元配列をサブセット化して、サブセットを取得したいと考えていx=yます。出力は

do.call("cbind",
        list(TestArray[1,1,,drop=FALSE],
             TestArray[2,2,,drop=FALSE],
             TestArray[3,3,,drop=FALSE]
            )
        )

私は(素朴に)そのような操作が可能であるべきだと考えました

library(Matrix)
TestArray[as.array(Diagonal(3,TRUE)),]

これは2次元で機能します

matrix(1:9,3,3)[as.matrix(Diagonal(3,TRUE))]

ただし、3 次元では誤差が生じます。

インデックス配列を生成できることを知っています

IndexArray=outer(diag(1,3,3),c(1,1,1,1),"*")
mode(IndexArray)="logical"

要素にアクセスする

matrix(TestArray[IndexArray],nrow=4,ncol=3,byrow=TRUE)

しかし、最初の方法ははるかに優れており、必要なメモリも少なくなります。希望どおりに動作するように修正する方法を知ってTestArray[as.array(Diagonal(3,TRUE)),]いますか? 多分私はいくつかの構文糖衣を欠いている...

4

2 に答える 2

1

ベンの答えに加えて、ここでは、仕事をする元のコード行に対する驚くほど簡単な変更があります。

matrix(TestArray[as.matrix(Diagonal(3,TRUE))],ncol=3,nrow=4,byrow=TRUE)

これas.matrix(Diagonal(3,TRUE))はリサイクルされるため機能します。

于 2013-07-17T20:15:47.887 に答える