【问题标题】:How to speed up multiple vector convolution in MATLAB?如何在 MATLAB 中加速多向量卷积?
【发布时间】:2014-02-07 21:25:34
【问题描述】:

我无法找到一种更快的方法来卷积多个向量。所有向量都具有相同的长度 M,因此这些向量可以组合成一个矩阵 (A),其大小为 (N, M)。 N 是向量的数量。

现在我正在使用以下代码对所有这些向量进行卷积:

B=1;

for i=1:N

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

end

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

【问题讨论】:

  • N 有多大?如果它很大(比如 10000),那么你的 B 向量会随着时间的推移而增长,这也会减慢速度。
  • 对于我的应用程序,N 通常不是很大(

标签: matlab vector convolution


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    测试数据:

    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);)。

    【讨论】:

    • 好点。但是,在我的具体情况下,Bsrc 只是 1。如果可以进一步加快内部循环计算(A0 部分),那就太好了。
    • 根据问题“所有向量具有相同的长度”。
    • 很抱歉给您带来了困惑。每个向量都被作为A的一列。B只是用于保存卷积结果并初始化为1。
    • @Kanzy 我认为您的意思是每个向量都是A。但是,出于好奇,你会对A0 做什么? A 经常更换吗?
    • @chappjc 是的,A 经常更改。每次我需要将 A 的所有行卷积在一起。所以我原来的问题中没有 A0。
    猜你喜欢
    • 2015-11-18
    • 2015-03-19
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    相关资源
    最近更新 更多