为什么 MATLAB 的 union 函数这么慢?

Why is MATLAB's union function so slow?

如果我想找到两个无序集合的并集,表示为一维向量,例如:

a = [2 4 6 8 1]
b = [1 2 5 7 9]

我可以使用联合函数:

c = union(a,b)

给出了答案:

c = [1 2 4 5 6 7 8 9]

但是,这似乎很慢(相对而言)。如果我 运行 对其进行 tic-toc 测试,我得到:

>> for test = 1
tic
c = union(a,b);
toc
end
Elapsed time is 0.000906 seconds.

然而,如果我使用这种更复杂的方法,我会更快地得到结果:

>> for test = 1
tic
a_1 = zeros(1,9);
b_1 = zeros(1,9);
a_1(a) = 1;
b_1(b) = 1;
c_1 = or(a_1,b_1);
c = find(c_1);
toc
end
Elapsed time is 0.000100 seconds.

这仍然为 c 给出了相同的答案,但速度大约是它的 9 倍(对于这个小例子,我不确定它的扩展性如何)

使用 union 有什么好处?谁能建议一种更紧凑的方式来表达我使用的第二种方法?

谢谢

几条评论:

  1. 您的代码不像 union 那样通用。您假设集合成员是严格的正整数。
  2. 如果集合成员的值很大,您的代码就会崩溃,例如。 10^20,因为它试图分配荒谬数量的内存。
  3. 一堆不使用 BLAS/LAPACK 或者不是内置的 Matlab 函数实际上很慢。它们的存在是为了方便,但当您可以自己更快地滚动某些东西时,不要感到震惊,尤其是如果您可以专注于您的特定问题。
  4. 使用逻辑数组表示集合(这就是您所做的)对于可能的集合成员集合非常小的问题可能非常有效。