我希望能够根据数字的大小为向量中的数字分配一个等级,并创建一个包含这些等级的新向量。
例如,如果我有向量 [5, 2, 3, 1]
,我想返回 [4, 2, 3, 1]
(如5 是最大的数,1 是最小的数)。相同的数字最好共享平均排名(例如,如果两者相同且最低,则他们的平均排名应为 1.5)。
如何在 MATLAB 中实现这一点?
最佳答案
我建议您使用 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。
关于matlab - 为向量中的数字分配等级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18746759/