我遇到了一个问题,即找到一种更快的方法来卷积多个向量。所有向量具有相同的长度M,因此这些向量可以组合为具有大小(A
,N
)的矩阵(M
)。 N
是向量的数量。
现在我使用以下代码来卷积所有这些向量:
B=1;
for i=1:N
B=conv(B, A(i,:));
end
我发现这段代码在我的程序中成为速度限制步骤,因为它经常被调用。我的问题是,有没有办法让这个计算更快?考虑M
是一个小数字(比如2)。
答案 0 :(得分:2)
如果在频域中将卷积实现为乘法,那么速度应该快得多。
查看fftfilt
的实施方式。使用fftfilt
无法获得最佳性能,因为您只想在所有卷积完成后转换回时域,但它很好地说明了该方法。
答案 1 :(得分: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);
)。