1

3 次元行列 を仮定します。

>> a = rand(3,4,2)

a(:,:,1) =

    0.1067    0.7749    0.0844    0.8001
    0.9619    0.8173    0.3998    0.4314
    0.0046    0.8687    0.2599    0.9106


a(:,:,2) =

    0.1818    0.1361    0.5499    0.6221
    0.2638    0.8693    0.1450    0.3510
    0.1455    0.5797    0.8530    0.5132

線形インデックスを使用して、一度に多くの要素を保持します。

>> index1 = [1 ; 2 ; 1 ; 3];
>> index2 = [1 ; 4 ; 2 ; 3];
>> index3 = [1 ; 1 ; 2 ; 1];

>> indices = sub2ind(size(a), index1, index2, index3)

>> a(indices)

ans =

    0.1067
    0.4314
    0.1361
    0.2599

同じことをしたいのですが、最初の次元のすべての値を返します。この寸法のサイズは異なる場合があります。その場合、戻り値は次のようになります。

>> indices = sub2ind(size(a), ??????, index2, index3);

>> a(indices)

ans =

    0.1067    0.9619    0.0046    % a(:,1,1)
    0.8001    0.4314    0.9106    % a(:,4,1)
    0.1361    0.8693    0.5797    % a(:,2,2)
    0.0844    0.3998    0.2599    % a(:,3,1)

MatLabでそれを行う方法はありますか?

4

2 に答える 2

2
ind1 = repmat((1:size(a,1)),length(index2),1);
ind2 = repmat(index2,1,size(a,1));
ind3 = repmat(index3,1,size(a,1));

indices = sub2ind(size(a),ind1,ind2,ind3)

indices =

 1     2     3
10    11    12
16    17    18
 7     8     9

a(indices)


ans =

    0.1067    0.9619    0.0046
    0.8001    0.4314    0.9106
    0.1361    0.8693    0.5797
    0.0844    0.3998    0.2599
于 2012-06-29T20:51:52.823 に答える
1

最初の 2 つの次元とは別に、最後の 2 つの次元で線形インデックスを作成することで、必要な結果を得ることができます。a(:,:,:)で参照することが期待される 3D データ ブロックでも、a(:)(ご存知のように)または a(:,:)で参照できます。次のコードは、最後の 2 つの次元の sub2ind を見つけ、 を使用してそれらを繰り返しますmeshgrid。これは、@tmpearce によって提案されたソリューションと非常に似ていますが、半線形のインデックス作成と使用を明示的に示していmeshgridますrepmat

dim1 = 3;
dim2 = 4;
dim3 = 2;

rand('seed', 1982);
a = round(rand(dim1,dim2,dim3)*10)

% index1 = :
index2 = [1 ; 4 ; 2 ; 3];
index3 = [1 ; 1 ; 2 ; 1];

indices = sub2ind([dim2 dim3], index2, index3)
a(:, indices) % this is a valid answer

[X,Y] = meshgrid(1:dim1, indices)
indices2 = sub2ind([dim1, dim2*dim3], X,Y);

a(indices2) % this is also a valid answer, with full linear indexing
于 2012-06-29T21:09:01.273 に答える