Matlab按列排序3D矩阵

时间:2016-06-24 20:42:31

标签: matlab sorting matrix multidimensional-array

我正在尝试以2x25x30的形式对3D矩阵进行排序,并按照25列的第二行排序并执行此操作30次。我尝试过使用带有各种结果的sort函数。我继续以2x750x30的形式获得一个新矩阵,使用索引对第二行进行排序。 我的数据看起来像 - (1991 1992 1993; 1000 3200 2100), (1991 1992 1993; 3400 7000 5500)但是在2x25x30 矩阵。第一行是日历年,这些需要在最终输出中保留。排序基于第二行。谢谢!

1 个答案:

答案 0 :(得分:0)

方法#1

使用A作为输入数组,您可以使用broadcasting with bsxfun帮助的线性索引 -

[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)

示例输入,输出 -

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

使用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)