So I am currently using 'accumarray' to find the averages of a range of numbers wich correspond to matching ID's. Ex Input:
ID----Value
1 215
1 336
1 123
2 111
2 246
2 851
My current code finds the unweighted average of the above values, using the ID as the 'seperator' so that I don't get the average for all of the values together as one number, but rather seperate results for just values which have corresponding ID's. EX Output:
ID----Value
1 224.66
2 402.66
To achieve this I am using this code:
[ID, ~, Groups] = unique(StarData2(:,1),'stable');
app = accumarray(Groups, StarData2(:,2), [], @mean);
With StarData2 being the input of the function. This is working perfectly for my purposes until now, I need to know if accumarray can be made to give me a weighted average, such that each point in app (before the average is found) can be assigned a weight or that the @mean can be replaced with a function that can achieve this. The new input will look like this:
ID----Value----Weight
1 215 12
1 336 17
1 123 11
2 111 6
2 246 20
2 851 18
The new code must do the sum(val(i)*weight(i))/sum(weight) instead of just the standard mean. Thanks for any assistance.
You can use the row index as the "vals" (second input to
accumarray
) and define your own function that does the weighted mean on group of the data:Demonstration
Starting with
data
(the new input with your weights) and yourunique
command:The
accumarray
usage is as follows (redefineWeightedMeanFcn
every time you changedata
!):Checking manually, with the first group:
@Naveh - Generally, it is advised to avoid using loops in Matlab. Specifically, if you have a large set of data with many groups - it can be very slow.
Using
accumarray
is the way to go, but defining a function of the indices, as suggested by @chappjc, is error-prone, since in order to be be captured by the anonymous function, you must make sure thatas @chappjc says in his comment.
A slight modification to overcome this problem is to use
accumarray
twice:Sometimes you may need to replace the
[]
argument by the size of the required output.What you are trying to compute is not a weighted mean, but rather a weighted histogram.
There is a mex implementation of weighted histogram that can be found here. Though,
accumarray
is the safe way to go about.Instead of using
accumarray
, you can directly compute a weighted mean, or many other functions, quite easily:Is there a specific reason you wish to do this through
accumarray
?