我希望能够根据矢量大小为矢量中的数字指定排名,并创建包含这些排名的新矢量.
例如,如果我有向量[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.