2016-06-24 10 views
1

私は2x25x30の形式で3次元マトリックスをソートしようとしています。私はさまざまな結果を持つソート関数を使用しようとしました。私はインデックスを2番目の行を並べ替えるために2x750x30の形式で新しい行列を取得し続けています。 私のデータは、 - (1991 1992 1993; 1000 3200 2100)、 (1991 1992 1993; 3400 7000 5500)のように見えますが、2x25x30 のマトリックスです。第1列は暦年であり、これらは最終的な出力で維持される必要があります。ソートは2番目の行に基づいています。ありがとうございました! AMatlab列ごとの3Dマトリックスの並べ替え

+0

2行目の並べ替えはどういう意味ですか?最初の次元、2番目または3番目にソートすることができます。 – karakfa

+0

データと予想される出力を作成するコードを提供すると便利です。 – Suever

+0

2x25x30では、それはヘッダーとして機能する暦年ではない行です。この例では、暦年は1991年、1992年、1993年です。この行はソートされていませんが、その下の行はソートされていません。ありがとうございます – user2100039

答えて

0

アプローチ#1

入力配列として、あなたはbroadcasting with bsxfunによって助け線形インデックスを使用することができます - で

A(:,:,1) = 
     1991  1992  1993 
     1000  3200  2100 
A(:,:,2) = 
     1991  1992  1993 
     3400  7000  5500 
out(:,:,1) = 
     1991  1993  1992 
     1000  2100  3200 
out(:,:,2) = 
     1991  1993  1992 
     3400  5500  7000 

-

[m,n,r] = size(A); 
[~,idx] = sort(A(2,:,:)) 
idx2D = bsxfun(@plus,(idx-1)*m,(1:size(A,1))') 
idx3D = bsxfun(@plus,idx2D,permute(m*n*(0:1),[1,3,2])) 
out = A(idx3D) 

サンプル入力、出力MATLAB 2016Bの自動放送、それほどきれいに見えるでしょう -

[m,n,r] = size(A); 
[~,idx] = sort(A(2,:,:)) 
out = A((1:size(A,1))' + (idx-1)*m + permute(m*n*(0:r-1),[1,3,2])) 

アプローチ#2

再びbsxfunを使用して、しかし、2Dカラム割出しこの時間はそうように、第bsxfun-INGのを回避するのに役立つ配列を再形成 -

[m,n,r] = size(A); 
[~,idx] = sort(A(2,:,:)); 
out = reshape(A(:,bsxfun(@plus,squeeze(idx),n*(0:r-1))),m,n,r) 
+0

アプローチ2は素晴らしいです! bsxfunとsqueezeがどのように「変形」と一緒に働いているのか説明できますか?ありがとうございました – user2100039

関連する問題