2015-11-11 14 views
5

Chciałbym szeregować (porządkować) elementy wektora w Matlab i aby elementy o tej samej wartości miały tę samą wartość (w porządku malejącym). Więc chciałbym rutynowe, takie jak:Wartości rang Matlaba w wektorze z powtarzanymi wielokrotnie elementami

>> Rank = ComputeRanking([ 5 10 5 5 1]) 

Rank = 

2 1 2 2 5 

znalazłem częściowe rozwiązanie na miejscu MATHWORKS: ranking values:

function vecRank = ComputeRanking2(dataVector) 

% 
% Sort data in descending order with duplicates 
% 

[srt, idxSrt] = sort(dataVector,'descend'); 
% Find where are the repetitions 
idxRepeat  = [false; diff(srt) == 0]; 
% Rank with tieds but w/o skipping 
rnkNoSkip  = cumsum(~idxRepeat); 
% Preallocate rank 
vecRank    = 1:numel(dataVector); 
% Adjust for tieds (and skip) 
vecRank (idxRepeat) = rnkNoSkip(idxRepeat); 
% Sort back 
vecRank (idxSrt) = vecRank ; 

end 

To działa, jeśli istnieje jeden duplikat (2 elementy o tej samej wartości) ale jeśli są 2 lub więcej, jak w moim przykładzie, to nie działa. Jak mogę zrobić, aby obsłużyć dowolną liczbę duplikatów?

Odpowiedz

8

unique z 'stable' ułatwia to:

[srt, idxSrt] = sort(dataVector,'descend'); 
[~,rnk,idxrnk] = unique(srt, 'stable'); 
unsorted = rnk(idxrnk); 

result = unsorted(idxSrt)' 
+0

Wielkie dzięki @Dan, t czapka działa świetnie – MeSS83

5

Oto kolejny sposób: ranga każdego elementu jest 1 plus liczba unikalnych elementów, które są mniejsze niż tego elementu:

result = 1 + sum(bsxfun(@lt, dataVector(:).', dataVector(:)), 1); 

Dla dataVector = [5 10 5 5 1]; daje to

result = 
    2  1  2  2  5 
Powiązane problemy