一个更快的方法来实现intersect()给我的东西?

时间:2011-11-16 22:10:34

标签: performance matlab optimization intersection

我发现在我的matlab函数中花费的很多时间在此代码中:

intersect(freq_bins, our_bins);

两者都可以是相当大的向量,并且仅由整数组成。我只需要知道两者中的整数。这确实是intersect()的原始目的,所以我怀疑答案是:它没有变得更好。但也许有人有一些建议。

2 个答案:

答案 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.