Matlab:如何对2D数组进行排名并在其他2D数组中标记排名?

时间:2014-07-16 15:47:09

标签: arrays algorithm matlab sorting matrix

我正在考虑一种简单的算法来对我的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是否具有直接执行它的功能。或者如果你能提供一些实现算法的想法会更好。非常感谢你!

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望按其等级替换每个元素。我提供三种方法来做到这一点;第三个似乎是你想要的。

将您的示例数据定义为

data = [0 2 15 34;
        0 15 21 24;
        0 3 5 8;
        1 14 23 29];
  1. 这会将相等的排名分配给相等的数据值(如您的示例所示),但在此情况下不会跳过排名(您的示例似乎是所以):

    [~, ~, 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
    
  2. 这会将不同的排名分配给相等的数据值(因此跳过排名是不可能的):

    [~, 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
    
  3. 这会将相等的排名分配给相等的数据值,在这种情况下跳过排名

    [~, 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));