为什么MATLAB的联合功能如此之慢?

gus*_*y83 1 performance matlab set

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

a = [2 4 6 8 1]
b = [1 2 5 7 9]
Run Code Online (Sandbox Code Playgroud)

我可以使用union函数:

c = union(a,b)
Run Code Online (Sandbox Code Playgroud)

给出了答案:

c = [1 2 4 5 6 7 8 9]
Run Code Online (Sandbox Code Playgroud)

然而,这似乎相当缓慢(相对而言).如果我对它进行tic-toc测试,我得到:

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

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

>> 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.
Run Code Online (Sandbox Code Playgroud)

对于c,这仍然给出了相同的答案,但是快了大约9倍(用这个小例子,我不确定它的缩放程度)

使用工会有什么好处?任何人都可以建议一种更紧凑的方式来表达我使用的第二种方法吗?

谢谢

Mat*_*unn 5

几条评论:

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