Есть ли функция, как "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);