2014-02-07 54 views
2

我在找到更快的方式来卷积多个向量时遇到问题。所有的矢量具有相同的长度M,所以这些矢量可以组合为具有大小(N,M)的矩阵(A)。 N是向量的数量。如何加速MATLAB中的多个矢量卷积?

现在,我使用下面的代码进行卷积所有这些向量:

B=1; 

for i=1:N 

B=conv(B, A(i,:)); 

end 

我发现这段代码变成我的程序中的限速步骤,因为频繁调用。我的问题是,有没有办法让这个计算更快?考虑M是一个小数字(比如2)。

+0

N有多大?如果它很大(比如说10000),那么随着时间的推移,你的B矢量会增加,这也会减慢速度。 – Lazarus

+0

对于我的应用程序,N通常不是很大(<100),但B确实随着时间的推移而增长。在这种情况下,我还不知道如何预先为B分配空间。 – Kanzy

回答

2

如果在频域中实现卷积乘法,它应该会快很多。

看看fftfilt的实施方式。使用fftfilt无法获得最佳性能,因为您只想在所有卷积完成后才转换回时间域,但它很好地说明了该方法。

1

卷积是关联的。合并小内核,将数据与数据进行一次卷积。

测试数据:

M = 2; N = 5; L = 100; 
A = rand(N,M); 
Bsrc = rand(1,L); 

参考(卷积用数据中的每个内核):

B = Bsrc; 
for i=1:N, 
    B=conv(B, A(i,:)); 
end 

组合内核:

A0 = 1; 
for ii=1:N, 
    A0 = conv(A0,A(ii,:)); 
end 
B0 = conv(Bsrc,A0); 

比较:

>> max(abs(B-B0)) 
ans = 
    2.2204e-16 

如果经常执行此卷积,请预先计算A0,以便您可以只执行一次卷积(B0 = conv(Bsrc,A0);)。

+0

好点。但是,在我的具体情况中,Bsrc只是1.如果内部循环计算(A0部分)可以进一步加速,那将非常棒。 – Kanzy

+0

根据这个问题,“所有载体的长度都一样”。 –

+0

对不起,我感到困惑。每个向量已被放置为A的列。B正被用于保存卷积结果并初始化为1. – Kanzy