2016-11-16 4 views
0

3次元行列を1つの次元を表す3つの行列で部分集合したい。 例:私は、サブセット行列と同じ次元の行列を望む結果サブディジット多色。行列を使った配列

set.seed(1) 
    A = array(sample(1:10,24, replace=TRUE), dim=c(3,4,2)) 

    ind_dimension1 = matrix(c(1,3,2,1), nrow=2) 
    ind_dimension2 = matrix(c(4,3,2,1), nrow=2) 
    ind_dimension3 = matrix(c(1,2,2,1), nrow=2) 

、すなわち2×2:

A(sub2ind(size(A), ind_dimension1, ind_dimension2, ind_dimension3)) 
:MATLABで

# A[1,4,1](=1) A[2,2,2](=8) 
    # A[3,3,2](=10) A[1,1,1](=3) 

これはによって行うことができます

2つの次元、すなわちA2=A[,,1]の場合、Matlabコマンドsub2ind(size(A2), ind_dimension1, ind_dimension2)は、Hiebelerが述べたように(ind_dimension2-1)*dim(A2)[2]+ind_dimension1でRに複製できます(2010)https://cran.r-project.org/doc/contrib/Hiebeler-matlabR.pdf(5ページ)。これは高次元では不可能です。

ありがとうございます。

答えて

0

これはいかがですか?

myMat <- matrix(A[cbind(c(ind_dimension1), 
         c(ind_dimension2), 
         c(ind_dimension3))], 
        dim(ind_dimension1)) 

myMat 
    [,1] [,2] 
[1,] 1 8 
[2,] 10 3 

これは、所望の要素を抽出する(help("[")参照)マトリックスのサブセットを使用します。次元行列はcでベクトルに変換され、次に配列から抽出するために使用されるcbindの行列に再結合されます。得られたベクターはmatrixに供給され、所望の寸法はdimで生産される。

+0

ありがとうございます。これはまさに私が望んでいたものです。全体として、Matlabと比較してサブセット化はRの方がずっと簡単です。 – Mollifier