我希望能够根据矢量大小为矢量中的数字指定等级,并制作包含这些等级的新矢量。
例如,如果我有向量[5, 2, 3, 1]
,我想返回[4, 2, 3, 1]
(因为5是最大的数字,1是最小的数字)。等数应优先分享平均等级(例如,如果两者相同且最低,则应获得平均等级1.5)。
如何在MATLAB中实现这一目标?
答案 0 :(得分:11)
我建议您使用unique
:
[~, ~, ranking] = unique(x);
它还对矢量进行排序,但将相同的值映射到相同的索引。这样,原始向量中的相同元素获得相同的等级。例如,如果x = [5 2 3 1 3]
,我们得到:
ranking =
4 2 3 1 3
如果您想要“平均”排名,可以将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);
在我们的示例中,我们将得到:
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