我正在考虑一种简单的算法来对我的二维数组进行排序,并将它们的排序标记为与二维数组相同的大小。
例如,我在下面有一个矩阵:
[0 2 15 34;
0 15 21 24;
0 3 5 8;
1 14 23 29]
输出应该如下:
[1 5 10 16;
1 10 12 14;
1 6 7 8;
4 9 13 15]
我是 matlab 的新手,我不确定 matlab 是否具有直接执行此操作的功能。或者能提供一些实现算法的思路就更好了。非常感谢!
最佳答案
如果我没理解错的话,您想用每个元素的等级来替换它。我提供三种方法来做到这一点;第三个似乎是你想要的。
让您的示例数据定义为
data = [0 2 15 34;
0 15 21 24;
0 3 5 8;
1 14 23 29];
这会为相同的数据值分配相同的排名(如您的示例所示),但在这种情况下不会跳过排名(您的示例似乎所以):
[~, ~, vv] = unique(data(:)); result = reshape(vv, size(data));
根据您的示例数据,这给出了
result = 1 3 8 13 1 8 9 11 1 4 5 6 2 7 10 12
这会将不同的排名分配给相同的数据值(因此跳过排名是不可能的):
[~, vv] = sort(data(:)); [~, vv] = sort(vv); result = reshape(vv, size(data));
使用您的示例数据,
result = 1 5 11 16 2 10 12 14 3 6 7 8 4 9 13 15
这会为相同的数据值分配相同的排名,在这种情况下,它会跳过排名:
[~, vv] = sort(data(:)); [~, vv] = sort(vv); [~, jj, kk] = unique(data(:), 'first'); result = reshape(vv(jj(kk)), size(data));
使用您的示例数据,
result = 1 5 10 16 1 10 12 14 1 6 7 8 4 9 13 15
另一种方法,单行:对于每个条目,找出有多少个其他条目更小,然后加 1:
result = reshape(sum(bsxfun(@lt,data(:),data(:).'))+1, size(data));
关于arrays - Matlab:如何对二维数组进行排名并在另一个二维数组中标记排名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24785156/