假设你有一个一维矩阵
a = rand(1,5);
[sa i] = sort(a);
then sa
and a(i)
是相同的。然而,如果矩阵的大小增加
a = rand(3,4);
[sa i] = sort(a);
then sa
and a(i)
不一样。当我尝试按三维矩阵的第三个维度对三维矩阵进行排序时,也会发生同样的情况。
我如何访问的值a
通过索引i
?或者换句话说,我如何计算sa=a(X)
, what X
应该?
Edit:
感谢您的解决方案。但是,当您更改排序依据的维度时,它们不起作用。尽管如此,我还是接受了这个想法并用它来构建一个通用的形式。
该算法所做的就是构建矩阵的索引。 MATLAB 按列索引单元格。因此,该指数由下式给出
idx = r + (c-1)*ROWS + (p-1)*ROWS*COLS
where, 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维。
感谢您的帮助,您照亮了道路。 :)