【发布时间】:2011-08-04 08:33:59
【问题描述】:
假设你有一个一维矩阵
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维。 感谢您的帮助,您照亮了道路。 :)
【问题讨论】:
-
2D 和 3D 的最佳答案就在这里。
标签: matlab sorting matrix indexing