我试图在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
有没有一种有效的方法来实现这一目标?非常感谢!
答案 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));
当然你可以在循环中完成