为什么在Matlab中使用卷积矩阵而不是conv()函数?

ara*_*lar 5 matlab matrix convolution

我知道如果我们有两个向量-例如X和Y,我们可以使用在Matlab中计算它们的卷积Z = conv(X, Y)如在Mathworks.com上所述,还有另一种方法可以通过卷积矩阵来实现:

n = length(Y);
Z = convmtx(X,n)*Y;
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 如果可以依靠,为什么要使用卷积矩阵conv(X, Y)
  2. 引用的文档说前一种方法更有效,但不幸的是他们没有解释原因。是否主要是由于第二种方法需要计算和分配第二种方法,length(Y)还是有更多的方法(矩阵乘法比卷积运算等效率更高)?

谢谢!

编辑:我也联系了Mathworks.com,我想分享一下他们的答案:

您可以亲眼看到,如果运行此代码,conv确实会更有效。

tfs = 0; tsl = 0;
Nt = 20; sh = 500;
for kj = 1:Nt
    q = randn(10000,1); h = randn(sh,1);
    tic
    fst = conv(q,h);
    tfs = tfs+toc;
    tic
    slo = convmtx(q,sh); slo = slo*h;
    tsl = tsl+toc;
end
tfs = tfs/Nt; tsl = tsl/Nt; tsl/tfs
Run Code Online (Sandbox Code Playgroud)

您可以看到conv的速度提高了大约120倍。有几种原因,但最重要的可能是conv是(几乎)内置编译函数,而convmtx是在MATLAB语言,并在调用时进行解释(即,对其进行解析,进行类型检查等)。此外,即使您确实只需要一个副本,当您调用convmtx时,您也会创建输入数组的许多副本。

Lui*_*ndo 5

卷积矩阵只是乘法后将产生与卷积相同结果的矩阵。它始终是Toeplitz矩阵。

卷积矩阵不适用于卷积的实际计算。它的应用是在需要将卷积表示为矩阵乘法的情况下。

作为类比,考虑离散傅里叶变换(DFT)。众所周知,DFT几乎总是使用非常高效的FFT算法进行计算。但是,您可以根据需要将DFT表示为矩阵。您永远不会将其用于DFT的实际计算。但是从概念上讲,它有时有助于将DFT表示为矩阵乘法。例如,这允许人们将DFT视为向量空间中基础变化

  • @ A.Donda:是的,效率更高,是的(尤其是在硬件加速的情况下),但是我相信(取决于实现方式)DFT方法与标准矩阵乘法相比会导致更大的数值误差。如果我错了纠正我。我找不到很好的参考。 (2认同)