4

MATLABでループをベクトル化する方法を改善したいと思います。現時点では、intのリスト内の値の出現をカウントしようとしています。私のコードはこれに似ています:

list = [1 2 2 3 1 3 2 2 2 1 5];
occurrence_list = zeros(1,max(list));

for x=list
    occurrence_list(x) = occurrence_list(x) + 1;
end

forループの単純なベクトル化された置換はありますか?(または、欠落している組み込みのMATLAB関数がありますか?)これは非常に小さなデータセットで実行しているため、時間は問題になりません。MATLABのコーディングスタイルを改善したいだけです。

4

3 に答える 3

5

HIST / HISTC関数に加えて、ACCUMARRAYを使用して、発生(および他の多くの集計操作)をカウントできます。

counts = accumarray(list(:), 1)
%# same as: accumarray(list(:), ones(size(list(:))), [], @sum)

もう1つの方法は、Statistics ToolboxからTABULATEを使用することです(値、カウント、頻度を返します)。

t = tabulate(list)
t =
            1            3       27.273
            2            5       45.455
            3            2       18.182
            4            0            0
            5            1       9.0909

値が1mから始まらない場合、または最小値と最大値の間に大きなギャップがある場合は、カウントの間に多くのゼロが発生することに注意してください。代わりに以下を使用してください:

list = [3 11 12 12 13 11 13 12 12 12 11 15];
v = unique(list);
table = [v ; histc(list,v)]'

table =
     3     1
    11     3
    12     5
    13     2
    15     1

一意の値とその数を表します(これにより、少なくとも1回出現する値のみが一覧表示されます)

于 2010-08-06T21:42:36.607 に答える
4

そのためにhist関数を使用できます。出力を指定し、ビンを配列の範囲全体で整数にするように強制します。

list = [1 2 2 3 1 3 2 2 2 1 5]; 
bins = min(list):max(list);
counts = hist(list,bins);
于 2010-08-06T19:58:37.497 に答える
0

つまり、これは基本的にヒストグラムです。私の記憶から-HIST関数を探してください。

于 2010-08-06T20:00:00.523 に答える