0

我有一个这样的矩阵

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

现在我想添加第二列,条件是如果limit=0、interval=3和limit=limit+interval,或者换句话说,当第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 回答