【问题标题】:Why use the convolution matrix in Matlab as opposed to the conv() function?为什么在 Matlab 中使用卷积矩阵而不是 conv() 函数?
【发布时间】:2014-09-14 23:03:41
【问题描述】:

我知道如果我们有两个向量——比如 X 和 Y,我们可以在 Matlab 中使用Z = conv(X, Y) 计算它们的卷积。还有另一种方法可以做到这一点,即as described on Mathworks.com,通过卷积矩阵:

n = length(Y);
Z = convmtx(X,n)*Y;

我有两个问题:

  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

您可以看到 conv 的速度提高了大约 120 倍。有几个 出现这种情况的原因,但最重要的可能是 conv 是 (几乎)一个内置的编译函数,而 convmtx 是在 MATLAB 中编码的 语言并在调用时被解释(即,它被解析,受到 层类型检查等)。此外,当您调用 convmtx 时,您会创建许多 输入数组的副本,即使您真的只需要一个。

【问题讨论】:

    标签: matlab matrix convolution


    【解决方案1】:

    卷积矩阵只是一个矩阵,它在乘法时会得到与卷积相同的结果。它始终是Toeplitz 矩阵。

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

    作为一个类比,考虑discrete Fourier transform (DFT)。众所周知,DFT 几乎总是使用非常有效的FFT 算法来计算。但如果你愿意,你可以represent the DFT as a matrix。您永远不会将其用于 DFT 的实际计算;但从概念上讲,有时将 DFT 表示为矩阵乘法会有所帮助。例如,这允许将 DFT 视为change of basis in a vector space

    【讨论】:

    • 在这种情况下可能会很有趣地注意到,计算卷积的最有效方法通常是通过(快速)傅里叶变换。 :-)
    • @A.Donda:更高效,是的(尤其是在硬件加速的情况下),但我相信(取决于实现)DFT 方法与标准矩阵乘法相比会导致更大的数值误差。如我错了请纠正我。我找不到好的参考。
    • @horchler,很有趣,我没想到。如果您找到参考资料,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 2020-06-07
    • 1970-01-01
    相关资源
    最近更新 更多