arrays - Matlab:如何对二维数组进行排名并在另一个二维数组中标记排名?

标签 arrays algorithm matlab sorting matrix

我正在考虑一种简单的算法来对我的二维数组进行排序,并将它们的排序标记为与二维数组相同的大小。

例如,我在下面有一个矩阵:

[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];
  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));
    

关于arrays - Matlab:如何对二维数组进行排名并在另一个二维数组中标记排名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24785156/

相关文章:

arrays - 无法将类型 '[[String : AnyObject]]' 的值分配给类型 '[[String : AnyObject?]]'

python - 查找第 N 个至少包含一位偶数的数字

arrays - Quicksort 算法的最坏情况

matlab - 用点划线和虚线绘制问题 : How to modify default linestyles for better use with vector renderer 'painters' ?

javascript - 循环对象内部的数组并将 id 吐出到下拉列表中

c++ - VS 2012 Ultimate update 4 不会编译数组

c# - 从数据库存储中选择 5 行,每一行都在一个数组中?

algorithm - 堆排序算法

matlab - 括号中的波浪字符

matlab - 计算矩阵中每列或行的 fft