假设您有一个1D矩阵
a = rand(1,5);
[sa i] = sort(a);
那么sa
和a(i)
是相同的。然而,如果矩阵的大小增加了
a = rand(3,4);
[sa i] = sort(a);
然后
sa
和a(i)
不相同。当我尝试通过其第三维对3D矩阵进行排序时,也会发生同样的情况。我如何通过索引
i
访问a
的值?换句话说,我该如何计算sa=a(X)
,X
应该是什么?编辑:
感谢各位提供的解决方案。然而,当您更改要排序的维度时,它们无法工作。尽管如此,我学到了思路,并使用它来构建一个通用形式。
算法所做的是构建矩阵的索引。 MATLAB按列索引单元格。因此,索引由下式给出:
idx = r + (c-1)*ROWS + (p-1)*ROWS*COLS
在这里,idx
代表索引,r
代表行位置,c
代表列位置,p
代表页位置。
因此,如果我们按第一维(普通的sort(a)
)排序,结果索引就是在列中的位置;如果我们按第二维排序,结果索引就是在行中的位置;如果我们按第三维排序,结果索引就是在页中的位置。话虽如此,还需要为给定情况生成行和列:
r = repmat((1:rows)',[1 cols pages]);
c = repmat(1:cols,[rows 1 pages]);
在给出的解决方案中已经解释了第一维度的排序。现在,让我们来对一个二维数组按照行的方式进行第二维度(即列)排序。
a = rand(4,5);
[rows cols pages] = size(a);
R = repmat((1:rows)',[1 cols pages]);
[sa idx] = sort(a,2);
nIdx = R + (idx-1)*rows;
isequal(sa,a(nIdx))
现在,如果我们想在第三个维度(页面)上使用相同的排序思路,我们需要执行以下操作:
a = rand(4,5,3);
[rows cols pages] = size(a);
R = repmat((1:rows)',[1 cols pages]);
C = repmat(1:cols,[rows 1 pages]);
[sa idx] = sort(a,3);
nIdx = R + (C-1)*rows + (idx-1)*rows*cols;
isequal(sa,a(nIdx))
同样的逻辑可以用于将其扩展到N维。感谢您的帮助,您照亮了道路。:)