我在找到更快的方式来卷积多个向量时遇到问题。所有的矢量具有相同的长度M,所以这些矢量可以组合为具有大小(N
,M
)的矩阵(A
)。 N
是向量的数量。如何加速MATLAB中的多个矢量卷积?
现在,我使用下面的代码进行卷积所有这些向量:
B=1;
for i=1:N
B=conv(B, A(i,:));
end
我发现这段代码变成我的程序中的限速步骤,因为频繁调用。我的问题是,有没有办法让这个计算更快?考虑M
是一个小数字(比如2)。
我在找到更快的方式来卷积多个向量时遇到问题。所有的矢量具有相同的长度M,所以这些矢量可以组合为具有大小(N
,M
)的矩阵(A
)。 N
是向量的数量。如何加速MATLAB中的多个矢量卷积?
现在,我使用下面的代码进行卷积所有这些向量:
B=1;
for i=1:N
B=conv(B, A(i,:));
end
我发现这段代码变成我的程序中的限速步骤,因为频繁调用。我的问题是,有没有办法让这个计算更快?考虑M
是一个小数字(比如2)。
如果在频域中实现卷积乘法,它应该会快很多。
看看fftfilt
的实施方式。使用fftfilt
无法获得最佳性能,因为您只想在所有卷积完成后才转换回时间域,但它很好地说明了该方法。
卷积是关联的。合并小内核,将数据与数据进行一次卷积。
测试数据:
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);
)。
N有多大?如果它很大(比如说10000),那么随着时间的推移,你的B矢量会增加,这也会减慢速度。 – Lazarus
对于我的应用程序,N通常不是很大(<100),但B确实随着时间的推移而增长。在这种情况下,我还不知道如何预先为B分配空间。 – Kanzy