# MATLAB accumarray problem

by atrus_ovis
Tags: accumarray, matlab
 P: 101 accumarray documentation Is anyone proficient in the use of accumarray? I supply two vectors of same length, indices L,weights W, L positive integers as required. I sort the indices to ascending.Then, the result of accumarray is not equal to unique(L).How could this be? Code for illustration: i = [46 47 47 46 48 49 48 48 48]'; w = 2*rand(size(i)); Y=[i';w']; [x y] = sort(Y(1,:)); Y = Y(:,y); Y,pause uw = accumarray((Y(1,:))',Y(2,:)'); ui = unique(i); numel(uw),numel(ui) --- OUTPUT : Y = 46.0000 46.0000 47.0000 47.0000 48.0000 48.0000 48.0000 48.0000 49.0000 1.5844 0.0714 1.9190 1.3115 1.6983 1.3575 1.5155 1.4863 1.8680 ans = 49 ans = 4 I get 49 weight vectors for the 9 indices, the unique of which are 4!
P: 1,724
It took me a few passes to read through the documentation and understand it, but I think the key is where it explains what the function actually does (and then apply that to the first example).

 Quote by MATLAB accumarray documentation The function processes the input as follows: Find out how many unique indices there are in subs. Each unique index defines a bin in the output array. The maximum index value in subs determines the size of the output array. Find out how many times each index is repeated. This determines how many elements of vals are going to be accumulated at each bin in the output array. Create an output array. The output array is of size max(subs) or of size sz. Accumulate the entries in vals into bins using the values of the indices in subs and apply fun to the entries in each bin. Fill the values in the output for positions not referred to by subs. Default fill value is zero; use fillval to set a different value.
In the case of the example, the output size is the maximum of the subs array--4. The subs array acts as an array of subscripts applied to the values contained in val. 101 is given a subscript of 1, 102 and 104 given subscripts of 2, 103 and 105 given subscripts of 4, and none given subscripts of 3. Bin labels, if you want to think of it in histogram terms.

When you apply accumarray to them, the first entry will be the sum of those elements with subscript 1, the second with subscript 2, and so on. Which is why the output array has a sum of zero for the third element (none of the elements of val were subscripted with three).