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]');
+