2016-12-18 6 views
-3

私はM x N x Oの行列を持っていますが、ベクトルの要素を持つベクトルMを使って、MATLABのMxN行列に縮小したいと思います。維持される第3の次元。1次元のインデックスベクトルを使用して3dから2dの配列を減らす

これは、元の3d配列のさまざまなページから選択されたエントリを持つ2次元配列を作成することです。

私はこのループを持っていますが、私はループのないソリューションに興味があります。

for ii = 1:M 
    tmp(ii, :) = P(ii, :, b(ii)); 
end 

をしかし、比較のために、ここでループのないソリューションです:

for i = 1:M 
    for j = 1:N 
     tmp(i, j) = P(i, j, b(i)); 
    end 
end 
+1

'j'ループを完全に削除し、' j'を ':'に置き換えても同じことができますよね? – beaker

+0

@ビーカーはい、良い考え。しかし、これを完全に無力化する方法はありますか? – Xaser

+0

はい、私はあなたに 'ndgrid'と' sub2ind'でそれを行う方法を与えることができます。私はどれくらいあなたを買うだろうか分かりませんが、興味があれば投稿できます。 – beaker

答えて

3

最も簡単な方法は、ちょうどあなたのコード内でjループを削除することであってもよいです。とサイズMx1

M = 7; 
N = 5; 
O = 6; 
P = ones(M, N, O) .* permute(1:O, [3 1 2]); 

(この場合、Iは各要素は、そのOインデックスに等しい3Dアレイを使用した)
b:3DアレイPを考える


値は1..O

b = randi(O, M, 1) 

から構成できますP(:,:,1)のすべての要素と使用する平面を選択するbを使用するPTS:

[rr, cc] = ndgrid(1:M, 1:N); 
inds = sub2ind(size(P), rr(:), cc(:), b(rr(:))); 
tmp = reshape(P(inds), M, N) 

について:

b.' = 5 4 1 5 3 1 3 

我々が得る:各行対応の

tmp = 

    5 5 5 5 5 
    4 4 4 4 4 
    1 1 1 1 1 
    5 5 5 5 5 
    3 3 3 3 3 
    1 1 1 1 1 
    3 3 3 3 3 

要素期待どおりbの要素に移動します。

関連する問題