sort in matlab and assign ranking

前端 未结 2 2084
长情又很酷
长情又很酷 2020-12-06 14:37

Hi I need to sort a vector and assign a ranking for the corresponding sorting order. I\'m using sort function [sortedValue_X , X_Ranked] = sort(X,\'descend\');

相关标签:
2条回答
  • 2020-12-06 15:12

    The syntax [sortedValues, sortedIndexes] = sort(x, 'descend') does not return rank as you describe it. It returns the indexes of the sorted values. This is really useful if you want to use the sort order from one array to rearrange another array.

    As suggested by @user1860611, unique seems to do what you want, using the third output as follows:

    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
    

    To get the order you want (decending) you'll need to reverse the order, like this:

    reverseRank = max(forwardRank) - forwardRank  + 1
    %Returns
    %reverseRank =
    %    2     1     3     3     6     6     6     5     6     4
    

    You may be done at this point. But you may want to sort these into the into an acsending order. This is a reorder of the reverseRank vector which keeping it in sync with the original x vector, which is exactly what the 2nd argument of sort is desined to help with. So we can do something like this:

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

    Which generates:

    xSorted =           15    13     5     5     3     1     0     0     0     0
    reverseRankSorted =  1     2     3     3     4     5     6     6     6     6
    
    0 讨论(0)
  • 2020-12-06 15:27

    tiedrank.m might be the thing you are looking for.

    >> x = round(rand(1,5)*10)
    x =
    8     7     3    10     0
    >> tiedrank(x)
    ans =
    4     3     2     5     1
    
    0 讨论(0)
提交回复
热议问题