Matlab在向量中对值进行排名,其中元素重复多次

MeS*_*S83 5 sorting matlab

我想在Matlab中排序(排序)向量的元素,并且具有相同值的元素具有相同的排名(按降序排列).所以我想要一个例程如:

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

Rank =

2 1 2 2 5
Run Code Online (Sandbox Code Playgroud)

我在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
Run Code Online (Sandbox Code Playgroud)

如果有一个重复(2个具有相同值的元素)但如果有2个或更多,如在我的示例中,它不起作用.如何处理任意数量的重复项?

Dan*_*Dan 8

unique'stable'让一切变得简单:

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

result = unsorted(idxSrt)'
Run Code Online (Sandbox Code Playgroud)


Lui*_*ndo 5

这是另一种方式:每个元素的等级是1加上小于该元素的唯一元素的数量:

result = 1 + sum(bsxfun(@lt, dataVector(:).', dataVector(:)), 1);
Run Code Online (Sandbox Code Playgroud)

为此dataVector = [5 10 5 5 1];给出了

result =
     2     1     2     2     5
Run Code Online (Sandbox Code Playgroud)