# HG changeset patch # User carandraug@octave.org # Date 1399039029 -3600 # Node ID 89055521e04d7f22243c95f4ce7494c1766b1f50 # Parent 01e69fd38459827197c54665e65de7694a497fdf 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. diff -r 01e69fd38459 -r 89055521e04d scripts/set/ismember.m --- 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]'); +