我正在考虑一种简单的算法来对我的2D数组进行排名,并将它们的排名标记为与2D数组相同的大小。
例如,我在下面有一个矩阵:
[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是否具有直接执行它的功能。或者如果你能提供一些实现算法的想法会更好。非常感谢你!
答案 0 :(得分:1)
如果我理解正确,您希望按其等级替换每个元素。我提供三种方法来做到这一点;第三个似乎是你想要的。
将您的示例数据定义为
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));