我们说你有一个矩阵
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
应该是什么?
Edit:
谢谢你的解决方案 . 但是,当您更改要排序的维度时,它们不起作用 . 不过,我接受了这个想法并用它来构建一般形式 .
算法正在做的是构建矩阵的索引 . 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维 . 感谢您的帮助,您点亮了道路 . :)
4 回答
从这里:http://www.mathworks.com/help/techdoc/ref/sort.html
[sa, i]=sort(a)
返回每列的有序索引 . 您只需要获得矩阵的正确线性指数 . 那么,对于2D矩阵,现在测试一下:
您可以使用IND2SUB和SUB2IND函数创建适用于任何N-D矩阵或排序维度的通用矢量化解法 . 在这里,我将这个解决方案打包成一个新函数
sort_linear_index
,它的行为就像SORT函数一样,只不过它将返回线性索引,这样无论A
是什么大小,_534512都会一直工作 .现在我们可以测试一下这个功能了: