将等级分配给向量中的数字

dre*_*mer 9 matlab vector

我希望能够根据矢量大小为矢量中的数字指定排名,并创建包含这些排名的新矢量.

例如,如果我有向量[5, 2, 3, 1],我想返回[4, 2, 3, 1](因为5是最大的数字,1是最小的).等数应该优先分享平均等级(例如,如果两者相同且最低,则它们的平均等级应为1.5).

我怎样才能在MATLAB中实现这一目标?

Eit*_*n T 12

我建议你使用unique:而不是排序

[~, ~, ranking] = unique(x);
Run Code Online (Sandbox Code Playgroud)

它还对矢量进行排序,但将相同的值映射到相同的索引.这样,原始向量中的相同元素获得相同的等级.例如,如果x = [5 2 3 1 3],我们得到:

ranking =
   4   2   3   1   3
Run Code Online (Sandbox Code Playgroud)

如果你想要一个"平均"排名,你可以accumarray结合使用unique和从中获得的信息sort,所以改为:

[~, ~, idx_u] = unique(x);
[~, idx_s] = sort(x);
mean_ranks = accumarray(idx_u(:), idx_s(idx_s), [], @mean);
ranking = mean_ranks(idx_u);
Run Code Online (Sandbox Code Playgroud)

在我们的示例中,我们将获得:

ranking =
   1.0000
   2.0000
   3.5000
   5.0000
   3.5000
Run Code Online (Sandbox Code Playgroud)

请注意,两个值3的平均排名为3.5,因为他们共享排名3和4.