是否有像“ismember”这样的功能但效率更高?

时间:2013-07-18 04:21:08

标签: matlab set performance

例如,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”更有效?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这可能无法避免,但计算速度太慢的一个原因是您没有以矢量化方式调用ismember

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

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