Mercurial > hg > octave-nkf
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 |