寻找一种有效的替代方案,以及#34;相交"在matlab 2015中的功能

时间:2016-05-09 06:30:28

标签: matlab

我在MATLAB 2015中有一个程序,调用intersect功能超过500万次。例如:

x=[2,4,6,3]
y=[3,5,7,9,1,6,4]
tic;for i=1:5*1e6;t=intersect(x,y);end;toc;
*Elapsed time is 365.038992 seconds in my computer

但由于intersect函数我的程序太慢,intersect函数是否有任何有效的替代方法?内置或Mex或类似的东西。我也试过unique(x(ismember(x,y)))

tic;for i=1:5*1e6;t=unique(x(ismember(x,y)));end;toc;
*Elapsed time is 227.7381 seconds in my computer

虽然这会带来一些改善,但这还不够! 我对unique()ismember()也有同样的问题。

1 个答案:

答案 0 :(得分:1)

这是一个适用于所有情况的快速解决方案(元素可以是非唯一的和/或非正面的)。

tmp = sort(x(ismembc(x,sort(y))));
t = tmp([~~diff(tmp),true]);

背后的基本理念与unique(x(ismember(x,y)))的建议相同,但ismemberunique都很慢且可以改进。我们可以使用内置ismembc而不是ismember,但我们需要确保对第二个参数进行排序。而不是使用unique,我们使用sortdiff和逻辑索引的组合。

在Matlab 2013b上比intersect提高了 ~15.5x

>> tic; for i=1:1e5, tmp=sort(x(ismembc(x,sort(y)))); t = tmp([~~diff(tmp),true]); end; toc;
Elapsed time is 0.998081 seconds.

>> tic; for i=1:1e5, t = intersect(x,y); end; toc;
Elapsed time is 15.538410 seconds.

对于更具体的情况,如果您知道x的元素是唯一的,您可以立即使用ismembc的结果,从而导致 ~33x 加速:

>> tic; for i=1:1e5, t = x(ismembc(x,sort(y))); end; toc;
Elapsed time is 0.465070 seconds.

基准测试结果可能在另一个Matlab版本和/或PC上明显不同,但我相信无论如何结果都是一样的。