4

こんにちは、ベクトルを並べ替えて、対応する並べ替え順序にランキングを割り当てる必要があります。ソート機能を使用しています[sortedValue_X , X_Ranked] = sort(X,'descend'); が、問題は同じ値 (ゼロ) に対して異なるランクを割り当てることです。すなわちx = [ 13 15 5 5 0 0 0 1 0 3]、私はゼロが6である同じ最後のランクを取ることを望んでおり、5は3番目のランクを共有する必要があります..何か提案はありますか?

4

2 に答える 2

10

あなたが説明したように、構文[sortedValues, sortedIndexes] = sort(x, 'descend')はランクを返しません。ソートされた値のインデックスを返します。これは、ある配列のソート順を使用して別の配列を再配置する場合に非常に便利です。

@ user1860611 が示唆するuniqueように、次のように 3 番目の出力を使用して、必要なことを行うようです。

x = [ 13 15 5 5 0 0 0 1 0 3];
[~, ~, forwardRank] = unique(x);
%Returns
%forwardRank =
%     5     6     4     4     1     1     1     2     1     3

必要な順序 (降順) を取得するには、次のように順序を逆にする必要があります。

reverseRank = max(forwardRank) - forwardRank  + 1
%Returns
%reverseRank =
%    2     1     3     3     6     6     6     5     6     4

この時点で完了かもしれません。ただし、これらを acsending 順に並べ替えたい場合があります。これは、reverseRank元のベクトルとの同期を維持するためのベクトルの並べ替えです。これは、xまさに の 2 番目の引数sortが目的としているものです。したがって、次のようなことができます。

[xSorted, ixsSort] = sort(x, 'descend');    %Perform a sort on x
reverseRankSorted = reverseRank(ixsSort);   %Apply that sort to reverseRank

生成するもの:

xSorted =           15    13     5     5     3     1     0     0     0     0
reverseRankSorted =  1     2     3     3     4     5     6     6     6     6
于 2013-01-22T00:51:34.240 に答える
5

tierank.m はあなたが探しているものかもしれません。

>> x = round(rand(1,5)*10)
x =
8     7     3    10     0
>> tiedrank(x)
ans =
4     3     2     5     1
于 2014-01-30T09:40:02.483 に答える