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