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

时间:2014-09-14 23:03:41

标签: matlab matrix convolution

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

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

我有两个问题:

  1. 如果我们可以依赖conv(X, Y)
  2. ,为什么要使用卷积矩阵
  3. 引用文献说前一种方法更有效,但不幸的是它们无法解释原因。主要是因为第二种方法需要length(Y)的计算和分配,还是需要更多(矩阵乘法比卷积运算更有效等)?
  4. 谢谢!

    编辑:我也联系过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
    
      

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

1 个答案:

答案 0 :(得分:4)

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

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

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