1

列 1 がインデックスで、列 2 から 6 がその特定のインデックスのデータである60x6マトリックスがあります。Xデータ列の各値にランクを割り当てたいと思います。列 2 から 5 は降順でランク付けされ (最高値はランク 1、最低値はランク 60)、列 6 は降順でランク付けされます (最低値はランク付けされます)。 1、最高ランクの 60) ですが、インデックス (列 1) に従って行の順序が維持されるようにします。同順位の順位には、値の昇順での順位の平均に等しい順位が割り当てられます。

私はいくつかの提案(ここここここ)を調べて、自分のバージョンを試しました:

[~,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
4

1 に答える 1

0

少し不器用ですが、私の問題に対する実行可能な解決策を見つけました。

これには、データの各列に個別にランクを抽出、ソート、および割り当ててから、ランクを別のテーブルに再結合することが含まれます。

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 行のコードが追加されるため、より洗練された代替案は非常に好評です。

于 2013-05-15T09:58:48.130 に答える