Search All of the Math Forum:
Views expressed in these public forums are not endorsed by
NCTM or The Math Forum.



Re: I'm dense, but...somebody 'splain accumarray() please?
Posted:
Jul 11, 2013 10:58 AM


"dpb" <none@non.net> wrote in message news:krkc3l$c3v$1@speranza.aioe.org... > On 7/10/2013 1:35 PM, Kelly Kearney wrote: > ... > >> I forget how the hell I learned this trick, because the documentation >> for the SZ input to accumarray is confusing at best (rereading it now, >> it still doesn't make any sense to me, even knowing what the effect is). >> Anyway, to get cell array output from your example, add that third >> input, and make sure your function returns a cell array: >> >>>> a = [1 1 1 2 2 2 2 3 3 3]; >>>> b = [1 2 3 4 5 8 10 5 6 8]; >>>> [u,~,c] = unique(a); >> >>>> groups = accumarray(c,b, [length(u) 1], @(x) {x}) >>>> missing = accumarray(c,b, [length(u) 1], @(x) {setdiff(min(x):max(x), >>>> x)}) > > Brilliant!!! :) > > I agree on the doc re: SZ argument; I puzzled over it at length initially > and gave up. I've not yet pursued all of Steven's in depth enough to know > if that helps on that point or not but thanks...this really solves several > things have seen recently.
I didn't discuss the SZ input in my previous explanation; I was more focused on the subscripts and the FUN input since I expected them to be more confusing. As you might suspect from the name of the input argument in the doc, SZ has to do with the size of the output. It allows you to specify that you want the output to be exactly a certain size. Let?s say you had a set of data like this:
r = [1; 2; 3; 4; 2; 3; 1]; c = [1; 3; 6; 4; 3; 2; 5]; v = [1; 1; 1; 1; 1; 1; 1];
and you need the result of ACCUMARRAY to be a 5by6 matrix so it matches the results of some previous computation. There's no 5 in r so if you did:
A = accumarray([r, c], v)
A would be of size [max(r) max(c)] or in this case 4by6. When you tried to concatenate it with ( [ ] ) or add it to (+) your previous results you'd receive a dimension mismatch error. If you did:
B = accumarray([r, c], v, [5 6])
B would be 5by6 regardless of whether or not r contained a 5 or c contained a 6. In this case the last row of B is all zeros because there's no 5 in r. This can also guard you against invalid data. If you know the output MUST be 5by5 and the 6 in c was a typo:
C = accumarray([r, c], v, [5 5])
you would receive an error that states basically that one of the subscripts was greater than the desired size of the output.
 Steve Lord slord@mathworks.com To contact Technical Support use the Contact Us link on http://www.mathworks.com



