2013-07-18 3 views
11

Например, A - это номер set.b - это элементы.Есть ли функция типа «ismember», но более эффективная?

Я хочу, чтобы проверить число в Ь, является ли элемент множества А.

Я знаю функцию 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»?

+0

ли вам действительно нужно использовать его 1 миллион раз последовательно? –

+0

@ Dennis Jaheruddin Я запускаю его миллион раз только для проверки эффективности, не очень хочу запускать его миллион раз. – lihaitao

ответ

14

Вы можете использовать версию 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 
+1

Большое спасибо! Кстати, где «_ismemberoneoutput»? «Edit _ismemberoneoutput» не смог найти функцию. Как вы знаете функцию? Где она? – lihaitao

+0

@lihaitao Его здание в Matlab. В какой версии у вас есть? Я тестировал его в 2013 году? – Marcin

+0

@ Marcin Я использую R2013a.Как вы знаете функцию в Matlab? Как я мог узнать функции builin в Matlab? – lihaitao

0

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

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

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

Я запускаю его миллион раз только для проверки эффективности, не очень хочу запускать его миллион раз. – lihaitao

+0

@lihaitao true, мощная функция, подобная ismember, не очень эффективна для небольших примеров. Но я хочу сказать, что, если вы не запускаете его миллионы раз, время, затрачиваемое на решение проблемы малого масштаба, вероятно, не является наиболее важным показателем эффективности. –

Смежные вопросы