【问题标题】:Is there a function like "ismember" but more efficient?是否有类似“ismember”但更高效的功能?
【发布时间】:2013-07-18 04:21:07
【问题描述】:

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

【问题讨论】:

  • 真的需要连续使用100万次吗?
  • @Dennis Jaheruddin 我运行一百万次只是为了测试效率,并不是真的想运行它一百万次。

标签: matlab set performance


【解决方案1】:

您可以使用 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

【讨论】:

  • 非常感谢!对了,“_ismemberoneoutput”在哪里?“edit _ismemberoneoutput”找不到函数。你怎么知道函数?它在哪里?
  • @lihaitao 你可以试试其他无证版本,ismembc(b,A)。我通过检查 Matlab 的 ismember.m 的来源了解了该 buildin
  • 为了完整性:我认为在这个例子中它花费了 9 秒的主要原因是因为 ismember 不是内置的,所以这个测试循环不能被 JIT 化。换句话说,您的测试是非通用的;结果仅对循环使用ismember 的情况有效。再次使用非常大的bA 进行测试,您会发现两者的性能相当。正如您所指出的,使用 MEX 变体是脆弱且不可移植的,因为它会创建对特定 MATLAB 版本的依赖关系。仅用于性能关键部分,并做好记录。
  • +1:还有ismembc
  • 在 R2015a 中删除。
【解决方案2】:

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

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

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

【讨论】:

  • 我运行一百万次只是为了测试效率,并不是真的想运行它一百万次。
  • @lihaitao 是的,像 ismember 这样强大的功能对于小规模的例子来说不是很有效。但我的观点是,除非你已经运行了数百万次,否则解决小规模问题所花费的时间可能并不是衡量效率的最相关指标。
猜你喜欢
  • 2015-01-11
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 2012-08-01
  • 2012-04-04
相关资源
最近更新 更多