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