在matlab中排序并分配排名

sky*_*mit 4 sorting matlab ranking

嗨我需要对矢量进行排序并为相应的排序顺序分配排名.我正在使用排序功能,[sortedValue_X , X_Ranked] = sort(X,'descend'); 但问题是它为相同的值(零)分配不同的排名.即x = [ 13 15 5 5 0 0 0 1 0 3]我想要零取相同的最后一个等级,即6和5需要分享第3等等..任何建议?

Pur*_*uit 10

语法[sortedValues, sortedIndexes] = sort(x, 'descend')不会像您描述的那样返回排名.它返回已排序值的索引.如果要使用一个数组中的排序顺序重新排列另一个数组,这非常有用.

正如@ user1860611所建议的那样,unique似乎做了你想要的,使用第三个输出如下:

x = [ 13 15 5 5 0 0 0 1 0 3];
[~, ~, forwardRank] = unique(x);
%Returns
%forwardRank =
%     5     6     4     4     1     1     1     2     1     3
Run Code Online (Sandbox Code Playgroud)

要获得您想要的订单(降序),您需要撤销订单,如下所示:

reverseRank = max(forwardRank) - forwardRank  + 1
%Returns
%reverseRank =
%    2     1     3     3     6     6     6     5     6     4
Run Code Online (Sandbox Code Playgroud)

你可能已经完成了这一点.但是您可能希望将这些分类为一个按顺序排列.这是reverseRank向量的重新排序,它使它与原始x向量保持同步,这正是第二个参数sort所希望帮助的.所以我们可以这样做:

[xSorted, ixsSort] = sort(x, 'descend');    %Perform a sort on x
reverseRankSorted = reverseRank(ixsSort);   %Apply that sort to reverseRank
Run Code Online (Sandbox Code Playgroud)

哪个产生:

xSorted =           15    13     5     5     3     1     0     0     0     0
reverseRankSorted =  1     2     3     3     4     5     6     6     6     6
Run Code Online (Sandbox Code Playgroud)


bon*_*obo 5

tiedrank.m可能是您正在寻找的东西.

>> x = round(rand(1,5)*10)
x =
8     7     3    10     0
>> tiedrank(x)
ans =
4     3     2     5     1
Run Code Online (Sandbox Code Playgroud)