gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:00:26 26 4
gpt4 key购买 nike

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

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

[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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com