2016-05-03 8 views
7

この並べ替えは基本的にthat questionの拡張です。"Desort"マトリックス。

私はMATLABで行列Aを持っており、1次元に沿ってその行列をソートしたい:

A = rand(3,3,5); [B idx] = sort(A,3);

idxは、「並べ替え」インデックスを含む行列です。 Bidxだけを使用して行列Aを返すにはどうすればよいですか?

The answer元の質問の行列は、残念ながら機能しません。

+0

あなたは 'w(ix、:)= v'を試しましたか?': 'は無視された次元を表しますか? – Crowley

+0

私の場合、w(:、:idx)= Bのようなものですか?これは「下付きのディメンションの不一致」のために機能しません。 – Ethunxxx

+0

'w(idx)= B'は動作しますが、正しくありません – shamalaia

答えて

4

元のインデックスを取得するには、インデックスidxをソートする必要があります。作業の残りの部分には、すべてのdim-3インデックスに対応する、書式設定された行インデックスと列インデックスを取得する必要があります。実装はこのようなものになります -

-

[~,dim3idx] = sort(idx,3); 

[m,n,r] = size(B); 
[rowidx,colidx,~] = ndgrid(1:m,1:n,1:r); 

Aout = B(sub2ind(size(B),rowidx,colidx,dim3idx)) 

をパフォーマンスのために、1サイズパラメータから直接bsxfunで交互にsub2indによって生成された線形インデックスを取得することができますので、またそのように、ndgridを避けることに注意してください

Aout = B(bsxfun(@plus,bsxfun(@plus,(1:m)',m*(0:n-1)),m*n*(dim3idx-1)))