【问题标题】:MATLAB assign rank to values in a matrix in ascending/descending orderMATLAB 按升序/降序为矩阵中的值分配等级
【发布时间】:2013-05-08 22:07:09
【问题描述】:

我有一个60x6 矩阵X,其中第 1 列是索引,第 2 到第 6 列是该特定索引的数据。我想为数据列中的每个值分配排名,以便第 2 列到第 5 列按降序排列(最高值排名第 1,最低值排名第 60),第 6 列按降序排列(最低值排名1,最高排名60),但这样的行顺序保持根据索引(第1列)。排名关系的排名等于其按值升序排列的位置平均值。

我查看了许多建议(hereherehere)并尝试了自己的版本:

[~,Z1] = sort(X(:,2),'descend');
[~,Z2] = sort(X(:,3),'descend');
[~,Z3] = sort(X(:,4),'descend');
[~,Z4] = sort(X(:,5),'descend');
[~,Z5] = sort(X(:,6));

但似乎没有一个按我希望的方式工作。所以对于

    X =

        1    0.9503    0.5646    0.3785    0.5468   -0.0161     
        2    0.9430    0.5728    0.3320    0.6693   -0.0161
        3    0.5305    0.2719    0.1545    0.3480    0.0042
        4    0.8588    0.5816    0.3429    0.6477   -0.0158
        5    0.9391    0.5984    0.3362    0.6054   -0.0161
        6    0.3780    0.2307    0.0906    0.3387    0.0054

我需要

    Ans = 

         1   1   4   1   4   2
         2   2   3   4   1   2
         3   5   5   5   5   5
         4   4   2   2   2   4
         5   3   1   3   3   2
         6   6   6   6   6   6

【问题讨论】:

    标签: matlab sorting ranking


    【解决方案1】:

    我找到了一个有点笨拙但可行的解决方案。

    它涉及对每列数据分别提取、排序和分配排名,然后在另一个表中重新组合排名。

    Arank = sortrows(X(:,1:2),-2);       % sort data in descending (or ascending) order
    Arank(:,3)=1:60;                     % assign rank
    Arank = sortrows(Arank,1);           % re-sort by index
    % % same process is applied individually to each column
    Allranks = horzcat(Arank(:,[1,3]), Brank(:,3),... 
    Crank(:,3), Drank(:,3), Erank(:,3)); % combine all ranks sorted by index
    

    然而,这加起来总共有 20 行代码,所以任何更优雅的替代品都会很受欢迎!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-24
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 1970-01-01
      • 1970-01-01
      • 2018-03-18
      相关资源
      最近更新 更多