2016-05-11 8 views
1

n -by- 1ベクトルここで、n = 20000です。私はこのベクトルのデータのデシルランキングをしたいと思います。これは、基本的に各要素の値を対応するデシールで置き換えています。Matlabの分数ソート

私は現在、このようにそれをやっている:

Xはデータの私の配列である
deciles = quantile(X,9); 
X = discretize(X,[-inf deciles inf]); 

。私は、それぞれに同じ数の10個のデータグループを持たせたいので、これをやっています。

この手順を検証するか、もっと堅牢な方法があるかどうか教えてください。

+0

あなたは簡単にこれを検証することができます。ちょっとしたサンプル 'X'を構築し、正しい結果が得られるかどうかを確認してください。私がすぐに提案することの1つは、これをインプレースで行うことではありません。つまり、 'X'を無効にするのではなく、' X_dec'という新しい変数を作ります。あなたのプロシージャの自己検証に役立つ 'X'と比較することができます。 – Dan

+0

はい私はすでにそれを行いました。小さなサンプル。しかし、巨大なデータセットで使用されると、間違ってしまうことがあります。これが理にかなっているのか、それとも別の方法があれば、他の人から聞きたかっただけです!しかし、コメントありがとう! – Tulkkas

答えて

1

既知のサイズの単純なデータを作成することで、自分の持つものが正しいことを簡単に確認できます。

nGroups = 10; 
nPerGroup = 10000; 

X = linspace(0, 1, nGroups * nPerGroup); 

deciles = quantile(X, nGroups - 1); 
X = discretize(X,[-inf deciles inf]); 

nPerGroup = arrayfun(@(x)sum(X == x), 1:nGroups) 
%// 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 

代わりに、データの並べ替えと並べ替えを行い、列の数が目的のグループの数になるようにすることもできます。このアプローチは組み込み関数のみに依存する

X = linspace(0, 1, nGroups * nPerGroup); 
Y = reshape(sort(X), [], nGroups); 

各列は、別のグループになります。