Mercurial > octave-nkf
changeset 18750:89055521e04d
ismember: ~10x performance increase (input dependent) when set is 1 row.
* ismember.m: broadcast @eq instead of using unique(), when comparing rows
and the set is a single row for some performance increase.
author | carandraug@octave.org |
---|---|
date | Fri, 02 May 2014 14:57:09 +0100 |
parents | 01e69fd38459 |
children | a50d0d85dc73 |
files | scripts/set/ismember.m |
diffstat | 1 files changed, 17 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/scripts/set/ismember.m Thu May 01 15:01:07 2014 -0700 +++ b/scripts/set/ismember.m Fri May 02 14:57:09 2014 +0100 @@ -118,14 +118,19 @@ a_idx = zeros (rows (A), 1); else - ## FIXME: lookup does not support "rows", so we just use unique. - [xx, ii, jj] = unique ([A; s], "rows", "last"); - na = rows (A); - jj = ii(jj(1:na)); - tf = jj > na; + if (rows (s) == 1) + tf = all (bsxfun (@eq, A, s), 2); + a_idx = double (tf); + else + ## FIXME: lookup does not support "rows", so we just use unique. + [~, ii, jj] = unique ([A; s], "rows", "last"); + na = rows (A); + jj = ii(jj(1:na)); + tf = jj > na; - if (nargout > 1) - a_idx = max (0, jj - na); + if (nargout > 1) + a_idx = max (0, jj - na); + endif endif endif @@ -214,3 +219,8 @@ %! assert (result, [true; false; true]); %! assert (a_idx, [1; 0; 2]); +%!test +%! [result, a_idx] = ismember ([1:3; 5:7; 4:6; 0:2; 1:3; 2:4], [1:3], "rows"); +%! assert (result, logical ([1 0 0 0 1 0]')); +%! assert (a_idx, [1 0 0 0 1 0]'); +