For example, if
A = [7,8,1,1,2,2,2]; % the bins (or subscripts)
B = [2,1,1,1,1,1,2]; % the array
then the desired function "binsum" has two outputs, one is the bins, and the other is the sum. It is just adding values in B according to subscripts in A. For example, for 2, the sum is 1 + 1 + 2 = 4, for 1 it is 1 + 1 = 2.
[bins, sums] = binsum(A,B);
bins = [1,2,7,8]
sums = [2,4,2,1]
The elements in "bins" need not be ordered but must correspond to elements in "sums". This can surely be done by "for" iterations, but "for" iteration is not desired, because there is a performance concern. It is best if there is a build in function for this.
Thanks a lot!
This is another job for
accumarray
Results:
The index in
sums
corresponds to the bin value, sosums(2) = 4
. You can usenonzeros
to remove the unused bins so thatbins(n)
corresponds tosums(n)
or, to generate this form of
sums
in one line:Another possibility is to use
sparse
and thenfind
.Assuming
A
contains positive integers,This works because
sparse
automatically adds values (third input) for matching positions (as defined by the first two inputs).If
A
can contain arbitrary values, you also need a call tounique
, andfind
can be replaced bynonzeros
:Here is a solution using
sort
andcumsum
: