gpt4 book ai didi

matlab - 在 matlab 2015 中寻找 "intersect"函数的有效替代方案

转载 作者:行者123 更新时间:2023-12-02 09:06:45 29 4
gpt4 key购买 nike

我在 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 函数?内置或墨西哥或类似的东西。我还尝试了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() 也有同样的问题。

最佳答案

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

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.5 倍:

>> 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的结果,得到~ 33 倍加速:

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

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

关于matlab - 在 matlab 2015 中寻找 "intersect"函数的有效替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37109093/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com