# HG changeset patch # User Jaroslav Hajek # Date 1265708911 -3600 # Node ID b178769f31ca007d2e26a62af7c4cd6feec3427e # Parent c9780d8e228cecdfc0f1b67ed7ca485b300f2f56 more small improvements in accumarray diff --git a/scripts/ChangeLog b/scripts/ChangeLog --- a/scripts/ChangeLog +++ b/scripts/ChangeLog @@ -1,3 +1,8 @@ +2010-02-09 Jaroslav Hajek + + * general/accumarray.m: Use != instead of diff to compare indices in + dense case. Set explicit mode in sparse case to aid optimization. + 2010-02-09 Jaroslav Hajek * miscellaneous/menu.m: Use sscanf rather than eval. diff --git a/scripts/general/accumarray.m b/scripts/general/accumarray.m --- a/scripts/general/accumarray.m +++ b/scripts/general/accumarray.m @@ -126,13 +126,16 @@ val = cellfun (func, mat2cell (val(:)(idx), diff ([0; jdx]))); subs = subs(jdx, :); + mode = "unique"; + else + mode = "sum"; endif ## Form the sparse matrix. if (isempty (sz)) - A = sparse (subs(:,1), subs(:,2), val); + A = sparse (subs(:,1), subs(:,2), val, mode); elseif (length (sz) == 2) - A = sparse (subs(:,1), subs(:,2), val, sz(1), sz(2)); + A = sparse (subs(:,1), subs(:,2), val, sz(1), sz(2), mode); else error ("accumarray: dimensions mismatch") endif @@ -243,7 +246,7 @@ ## Sort indices. [subs, idx] = sort (subs); ## Identify runs. - jdx = find (diff (subs, 1, 1)); + jdx = find (subs(1:n-1) != subs(2:n)); jdx = [jdx; n]; val = mat2cell (val(idx), diff ([0; jdx])); ## Optimize the case when function is @(x) {x}, i.e. we just want to