Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

sort in matlab and assign ranking

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'); but the problem is it assigns different ranks for the same values (zeros). i.e. x = [ 13 15 5 5 0 0 0 1 0 3] and I want zeros to take the same last rank which is 6 and fives needs to share the 3rd rank etc.. any suggestions?

like image 701
skyisdalimit Avatar asked Dec 06 '22 09:12

skyisdalimit


2 Answers

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
like image 126
Pursuit Avatar answered Dec 24 '22 02:12

Pursuit


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
like image 27
bonobo Avatar answered Dec 24 '22 01:12

bonobo