3

入力行列が大きいため、データセット (「DATA」) からパーセンタイルを計算するのが非常に遅い次のコードがあります (「データ」は約 500.000 の長さで、「インデックス」から割り当てられた 10080 個の一意の値があります)。 .

このコードをより効率的にする可能性/提案はありますか? たとえば、どうにかして for ループを省略できますか?

k = 1;
for i = 0:0.5:100; % in 0.5 fractile-steps
     FRACTILE(:,k) = accumarray(Indices,Data,[], @(x) prctile(x,i));
     k = k+1;
end
4

1 に答える 1

7

prctile同じデータで何度も呼び出すと、パフォーマンスの問題が発生します。データセットごとに 1 回呼び出します。

FRACTILE=cell2mat(accumarray(Indices,Data,[], @(x) {prctile(x,[0:0.5:100])}));

1 回の呼び出しで 201パーセンタイルをprctile評価すると、元のコードの 2 回の反復とほぼ同じ計算時間がかかります。1つprctile目はこの方法の方が高速であるため、2つ目accumarrayは が 1 回だけ呼び出されるためです。

于 2016-01-28T13:10:44.300 に答える