【问题标题】:Matlab rank values in vector with elements repeated multiple timesMatlab对向量中的值进行排名,元素重复多次
【发布时间】:2015-11-11 11:07:26
【问题描述】:

我想在 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 个或更多,如我的示例所示,则它不起作用。如何处理任意数量的重复项?

【问题讨论】:

    标签: matlab sorting


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      对于dataVector = [5 10 5 5 1];,这给出了

      result =
           2     1     2     2     5
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多