我发现在我的matlab函数中花费的很多时间在此代码中:
intersect(freq_bins, our_bins);
两者都可以是相当大的向量,并且仅由整数组成。我只需要知道两者中的整数。这确实是intersect()的原始目的,所以我怀疑答案是:它没有变得更好。但也许有人有一些建议。
答案 0 :(得分:10)
intersect
来电ismember
。在您的情况下,您不需要intersect
执行的所有复杂检查,因此您可以节省一些开销并直接调用ismember
(注意:我确保在计时之前调用这两个函数):
a = randi(1000,100,1);
b = randi(1000,100,1);
>> tic,intersect(a,b),toc
ans =
76
338
490
548
550
801
914
930
Elapsed time is 0.027104 seconds.
>> tic,a(ismember(a,b)),toc
ans =
914
801
490
548
930
550
76
338
Elapsed time is 0.000613 seconds.
您可以直接调用ismembc
(实际测试的功能)来加快速度。请注意,ismembc
需要排序数组(因此,如果您的输入已经排序,则可以删除排序!)
tic,a=sort(a);b=sort(b);a(ismembc(a,b)),toc
ans =
76
338
490
548
550
801
914
930
Elapsed time is 0.000473 seconds.
答案 1 :(得分:0)
如果您可以假设您的输入包含唯一整数的排序列表,那么您可以使用非常简单的算法在线性时间内完成此操作:
function c = intersect_sorted(a,b)
ia = 1;
na = length(a);
ib = 1;
nb = length(b);
ic = 0;
cn = min(na,nb);
c = zeros(1,cn);
while (ia <= na && ib <= nb)
if (a(ia) > b(ib))
ib = ib + 1;
elseif a(ia) < b(ib)
ia = ia + 1;
else % a(ia) == b(ib)
ic = ic + 1;
c(ic) = a(ia);
ib = ib + 1;
ia = ia + 1;
end
end
c = c(1:ic);
end
长度为n和m的列表的最大运行时间为O(n + m)。
>>a = unique(randi(1000,100,1));
>>b = unique(randi(1000,100,1));
>>tic;for i = 1:10000, intersect(a,b); end,toc
Elapsed time is 1.224514 seconds.
>> tic;for i = 1:10000, intersect_sorted(a,b); end,toc
Elapsed time is 0.289075 seconds.