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

时间:2015-11-10 05:45:22

标签: performance matlab set

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

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

我可以使用union函数:

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倍(这个小例子,我不确定它的缩放程度)

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

感谢

1 个答案:

答案 0 :(得分:5)

几条评论:

  1. 你的代码不像联盟一般。您假设集合成员是严格正整数。
  2. 如果set成员的值很大,你的代码就会爆炸,例如。 10 ^ 20,因为它试图分配一个荒谬的内存量。
  3. 一堆不使用BLAS / LAPACK或不内置的Matlab功能实际上非常慢。为方便起见,他们会在那里工作,但如果你能自己更快地滚动一些东西,请不要感到震惊,特别是如果你能专注于你的特定问题。
  4. 使用逻辑数组表示集合(这就是你所做的)对于可能的集合成员集非常小的问题非常有效。