0

私はこのようなマトリックスを持っています

A=[ 1 2; 2 3; 3 4; 4 5; 5 6; 6 8; 7 9; 8 5; 9 4]

次に、2 番目の列を追加します。条件は、制限 = 0、間隔 = 3、制限 = 制限 + 間隔の場合、つまり、列 1 の値が 0 から 3 の範囲の場合、列 2 を合計する必要があるということです。 、3 から 6、6 から 9、および 9 から 12 で、列 2 の対応する値の合計が必要です。

私の解決策はそのようになります

range- sum
0 to 3 9
3 to 6 19
6 to 9 18

そのように、約7000x2のマトリックスがあります。範囲の代わりに、単にシリアル番号を指定することもできます。

これはほんの一例です。

4

1 に答える 1

5

これはACCUMARRAYの仕事です。最初に、一緒に追加する必要がある値のインデックスの配列を作成し、次に:を呼び出しますaccumarray

%# create test data
A=[ 1 2; 2 3; 3 4; 4 5; 5 6; 6 8; 7 9; 8 5; 9 4];

%# create indices from first column
%# if you have indices already, you can use them directly
%#   or you can convert them to consecutive indices via grp2idx
groupIdx = ceil(A(:,1)/3); %# 0+ to 3 is group 1, 3+ to 6 is group 2, etc

%# sum
result = accumarray(groupIdx,A(:,2),[],@sum)

result =
     9
    19
    18

編集

代わりに範囲内のエントリをカウントする必要がある場合でもaccumarray、合計ではなくヒストグラムに累積するだけで、それは仕事です。

%# use test data, groupIdx from above
A=[ 1 2; 2 3; 3 4; 4 5; 5 6; 6 8; 7 9; 8 5; 9 4];
groupIdx = ceil(A(:,1)/3); %# 0+ to 3 is group 1, 3+ to 6 is group 2, etc

%# find values to count
values2count = unique(A(:,2));

%# count the values
countsPerRange = accumarray(groupIdx,A(:,2),[],@(x){hist(x,values2count)})


%# inspect the counts for range #1
 [values2count,countsPerRange{1}']

ans =

     2     1
     3     1
     4     1
     5     0
     6     0
     8     0
     9     0
于 2012-07-08T19:00:20.653 に答える