MATLAB's built-in function accumarray
accepts a function fun
as a fourth argument.
A = accumarray(subs,val,sz,fun);
This applies fun
to each subset of elements in val
that have identical subscripts in subs
. The documentation however states:
If the subscripts in
subs
are not sorted with respect to their linear indices,fun
should not depend on the order of the values in its input data.
How can we implement a stable version of accumarray
, which doesn't have this limitation, but will guarantee that the subsets adopt the same order as given by val
?
Example:
subs = [1:10,1:10];
val = 1:20;
accumarray(subs(:), val(:), [], @(x)x(end)).'
The expected output of this would be 11:20
if accumarray
were stable. In fact the output is:
ans =
11 12 13 14 5 6 7 18 19 20
Our implementation should yield:
accumarrayStable(subs(:), val(:), [], @(x)x(end)).'`
ans =
11 12 13 14 15 16 17 18 19 20