Есть ли функция, как "ismember", но более эффективная?

Например, A - это номер set.b - это элементы.

Я хочу проверить, является ли число в b элементом набора A.

Я знаю, что функция matlab "ismember" может это сделать, но она не достаточно быстро, когда я использую ее миллион раз.

b=[1,2,9,100];
A=[1,2,3,4,5,6,7,8,9];
tic;for ii=1:1e6,ismember(b,A);end;toc
Elapsed time is 45.714583 seconds.

Я хочу вернуть [1,1,1,0], потому что 1,2,9 находятся в наборе A, а 100 - нет.

Знаете ли вы некоторые функции, такие как ismember или несколько более эффективны, чем "ismember"?

Ответ 1

Вы можете использовать версию mex, т.е. ismemberoneoutput. Мексовая версия намного быстрее.

b=[1,2,9,100];
A=[1,2,3,4,5,6,7,8,9];
tic;for ii=1:1e5,ismember(b,A);end;toc
%Elapsed time is 9.537219 seconds. On my pc

% A must be sorted!!! In this example it is already sorted,
% so no need for this here.
tic;for ii=1:1e5,builtin('_ismemberoneoutput',b,A);end;toc
%Elapsed time is 0.376556 seconds. On my pc

Ответ 2

Этого можно избежать, но одна из причин, почему ваш расчет настолько медленный, состоит в том, что вы не назовете ismember векторизованным способом.

Попробуйте это, это легко и быстро:

bigb = repmat(b,1e6,1);
ismember(bigb,A);