12

例如,A 是数字集合。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”更有效的方法吗?

4

2 回答 2

13

您可以使用 mex 版本,即ismemberoneoutput. mex 版本要快得多。

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
于 2013-07-18T04:40:03.807 回答
0

这可能无法避免,但是您的计算如此缓慢的一个原因是因为您没有ismember以矢量化方式调用。

试试这个,它既简单又快速:

bigb = repmat(b,1e6,1);
ismember(bigb,A);
于 2013-07-18T10:32:14.397 回答