2015-11-11 69 views
5

我想在Matlab中對矢量的元素進行排序(排序),並且具有相同值的元素具有相同的排名(按降序排列)。所以,我想這樣一個例行的:向量中的Matlab等級值與元素重複多次

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

Rank = 

2 1 2 2 5 

我發現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 

這工作,如果有一個重複(2個元素的值相同)但如果有2個或更多,如我的例子,它不起作用。我該如何處理任意數量的重複項?

回答

8

unique'stable'讓一切變得簡單:

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

result = unsorted(idxSrt)' 
+0

非常感謝@丹,噸帽子很棒 – MeSS83

5

這裏的另一種方式:每個元素的等級爲1加上獨特的元素,是比元素小的數目:

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

對於dataVector = [5 10 5 5 1];這給了

result = 
    2  1  2  2  5