comparison scripts/set/ismember.m @ 18881: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 d63878346099
children d00f6b09258f
comparison
equal deleted inserted replaced
18880:01e69fd38459 18881:89055521e04d
116 if (isempty (A) || isempty (s)) 116 if (isempty (A) || isempty (s))
117 tf = false (rows (A), 1); 117 tf = false (rows (A), 1);
118 a_idx = zeros (rows (A), 1); 118 a_idx = zeros (rows (A), 1);
119 else 119 else
120 120
121 ## FIXME: lookup does not support "rows", so we just use unique. 121 if (rows (s) == 1)
122 [xx, ii, jj] = unique ([A; s], "rows", "last"); 122 tf = all (bsxfun (@eq, A, s), 2);
123 na = rows (A); 123 a_idx = double (tf);
124 jj = ii(jj(1:na)); 124 else
125 tf = jj > na; 125 ## FIXME: lookup does not support "rows", so we just use unique.
126 126 [~, ii, jj] = unique ([A; s], "rows", "last");
127 if (nargout > 1) 127 na = rows (A);
128 a_idx = max (0, jj - na); 128 jj = ii(jj(1:na));
129 tf = jj > na;
130
131 if (nargout > 1)
132 a_idx = max (0, jj - na);
133 endif
129 endif 134 endif
130 135
131 endif 136 endif
132 endif 137 endif
133 138
212 %!test 217 %!test
213 %! [result, a_idx] = ismember ([1.1,1.2,1.3; 2.1,2.2,2.3; 10,11,12], [1.1,1.2,1.3; 10,11,12; 2.12,2.22,2.32], "rows"); 218 %! [result, a_idx] = ismember ([1.1,1.2,1.3; 2.1,2.2,2.3; 10,11,12], [1.1,1.2,1.3; 10,11,12; 2.12,2.22,2.32], "rows");
214 %! assert (result, [true; false; true]); 219 %! assert (result, [true; false; true]);
215 %! assert (a_idx, [1; 0; 2]); 220 %! assert (a_idx, [1; 0; 2]);
216 221
222 %!test
223 %! [result, a_idx] = ismember ([1:3; 5:7; 4:6; 0:2; 1:3; 2:4], [1:3], "rows");
224 %! assert (result, logical ([1 0 0 0 1 0]'));
225 %! assert (a_idx, [1 0 0 0 1 0]');
226