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

时间:2013-09-11 16:39:23

标签: matlab vector

我希望能够根据矢量大小为矢量中的数字指定等级,并制作包含这些等级的新矢量。

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

如何在MATLAB中实现这一目标?

3 个答案:

答案 0 :(得分:11)

我建议您使用unique

,而不是排序
[~, ~, ranking] = unique(x);

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

ranking =
   4   2   3   1   3

如果您想要“平均”排名,可以将accumarray与从uniquesort获得的信息结合使用,请执行以下操作:

[~, ~, idx_u] = unique(x);
[~, idx_s] = sort(x);
mean_ranks = accumarray(idx_u(:), idx_s(idx_s), [], @mean);
ranking = mean_ranks(idx_u);

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

ranking =
   1.0000
   2.0000
   3.5000
   5.0000
   3.5000

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

答案 1 :(得分:1)

您可以使用sort()的第二个输出参数来执行您想要的操作。

e.g。 (在Matlab 2011b中测试)

>> [~,ranking] = sort([5 2 3 1]);
>> ranking
ranking =
     4     2     3     1

编辑:(OP要求进一步解释)

从您的示例中,我确定较高的排名会变为较大的数字,因此如果列表已排序,则它基本上是值的位置。

调用sort( )将列表按升序排序。排序列表是返回的第一个东西。我把~放在那里,因为我们并不关心排序列表,所以我们只是抛弃了价值。

sort的第二个输出参数是未排序列表到排序列表的映射。也就是说,对于未排序列表中的每个项目,它在排序的列表中给出其位置。

再次编辑: 听起来你想从你的描述中得到“Fractional Ranking”。据我所知,Matlab没有内置任何内容直接执行此操作,但FEX上有文件。我从来没有使用它们,但有一个有全面的描述,所以它似乎是一个不错的选择:Rankings - File Exchange

答案 2 :(得分:0)

如果拥有统计和机器学习工具箱,则可以使用Matlab内置函数tiedrank

>> ranking = tiedrank([5 2 3 1 3]);
>> ranking

ranking =

    5.0000    2.0000    3.5000    1.0000    3.5000