Reputation: 1165
Suppose I have matrix A. 1st column is "group". Then I want to calculate the average of 2nd column for each group. So I want to create B.
A=
1 2
1 3
2 4
2 2
B=
1 2.5
2 3
The best thing I did until now is to construct a long for and if loop and use average function to get to B.
But I guess there will be more simple method. Is there?
Upvotes: 0
Views: 207
Reputation: 3476
I hadn't used accumarray
before, so due to the comment by @Dan I decided to give it a try.
At first I tried a naive version and used histc
to count occurrences to get the desired mean values... (Note that accumarray will sort the output the same order as unique
, so mean will be calculated correctly)
%// Naive version
ua = unique(A(:,1)); %// use as histc bins (or sorted "group" values)
result = accumarray(A(:,1), A(:,2)) ./ histc(A(:,1), uA);
Here, accumarray
operates by summing over all entries in A(:,2)
corresponding to identical subscripts in A(:,1)
.
But then I realised that by passing the optional fun
argument to accumarray
changing "summing" to "mean", you can do this as a one-liner:
%// one-liner
result = accumarray(A(:,1), A(:,2), [], @mean);
Upvotes: 2