2015-11-11 12 views
5

मैं मैटलैब में वेक्टर के तत्वों को रैंक (ऑर्डर) करना चाहता हूं और उसी मान वाले तत्वों में समान रैंक (अवरोही क्रम में) है। ranking values:वेक्टर में मैटलैब रैंक मान कई बार दोहराए गए

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

Rank = 

2 1 2 2 5 

मैं mathworks साइट पर एक आंशिक समाधान नहीं मिला: तो मैं एक नियमित जैसे चाहते हैं

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

'stable' साथ unique इस आसान बनाता है:

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

result = unsorted(idxSrt)' 
+0

धन्यवाद बहुत @ डैन, टी टोपी महान काम करता है – MeSS83

5

यहाँ एक और तरीका है:

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

के लिए: प्रत्येक तत्व के पद 1 प्लस अद्वितीय तत्व है कि उस तत्व से छोटे हैं की संख्या है dataVector = [5 10 5 5 1]; यह

result = 
    2  1  2  2  5 
संबंधित मुद्दे