在3d矩阵的第二维中排序

时间:2015-05-23 12:38:12

标签: arrays matlab matrix multidimensional-array

我试图在Matlab的3d矩阵的第二维中排序第一行,但sortrows()在这种情况下不起作用。

例如,我有一个类似

的矩阵
a(:,:,1)
1 2 4
3 1 6
2 0 5

a(:,:,2)
3 5 6
1 2 4
0 2 2

我需要得到结果

a(:,:,1)
1 2 4
2 0 5
3 1 6

a(:,:,2)
0 2 2
1 2 4
3 5 6

有没有一种有效的方法来实现这一目标?非常感谢!

2 个答案:

答案 0 :(得分:3)

如果我理解正确,您希望排序 每个第三个​​切片 第一个 列的值

[m,n,p] = size(a);
[~, row_ind] = sort(a(:,1,:), 1);
lin_ind = bsxfun(@plus, bsxfun(@plus, row_ind, (0:n-1)*m), reshape((0:p-1)*m*n, 1, 1, p));
result = a(lin_ind);

如何运作

沿第一维(行)排序a(:,1:,),并获取排序的索引(使用sort的第二个输出;第2行)。从这些行索引中,生成linear indices(使用bsxfun;第3行),它将提供所需的结果(第4行)。

示例

输入

a(:,:,1) = [1 2 4
            3 1 6
            2 0 5];
a(:,:,2) = [3 5 6
            1 2 4
            0 2 2];

这会产生

result(:,:,1) =
     1     2     4
     2     0     5
     3     1     6
result(:,:,2) =
     0     2     2
     1     2     4
     3     5     6

答案 1 :(得分:2)

只需对每个2d矩阵使用sortrows

a(:,:,1)=sortrows(a(:,:,1));
a(:,:,2)=sortrows(a(:,:,2));

当然你可以在循环中完成