我在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()
也有同样的问题。
答案 0 :(得分:1)
这是一个适用于所有情况的快速解决方案(元素可以是非唯一的和/或非正面的)。
tmp = sort(x(ismembc(x,sort(y))));
t = tmp([~~diff(tmp),true]);
背后的基本理念与unique(x(ismember(x,y)))
的建议相同,但ismember
和unique
都很慢且可以改进。我们可以使用内置ismembc
而不是ismember
,但我们需要确保对第二个参数进行排序。而不是使用unique
,我们使用sort
,diff
和逻辑索引的组合。
在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上明显不同,但我相信无论如何结果都是一样的。