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

为什么在Matlab中使用卷积矩阵而不是conv()函数?,matlab,matrix,convolution,Matlab,Matrix,Convolution,我知道如果我们有两个向量,比如X和Y,我们可以在Matlab中使用Z=conv(X,Y)计算它们的卷积。还有另一种方法,通过卷积矩阵: n = length(Y); Z = convmtx(X,n)*Y; 我有两个问题: 如果我们可以依赖conv(X,Y),为什么要使用卷积矩阵 引用的文件说,前一种方法更有效,但不幸的是,他们没有解释原因。这主要是因为第二种方法需要计算和分配长度(Y),还是还有更多(矩阵乘法比卷积运算等更有效) 谢谢大家! 编辑:我也联系了Mathworks.com,我想我会

我知道如果我们有两个向量,比如X和Y,我们可以在Matlab中使用
Z=conv(X,Y)
计算它们的卷积。还有另一种方法,通过卷积矩阵:

n = length(Y);
Z = convmtx(X,n)*Y;
我有两个问题:

  • 如果我们可以依赖conv(X,Y),为什么要使用卷积矩阵
  • 引用的文件说,前一种方法更有效,但不幸的是,他们没有解释原因。这主要是因为第二种方法需要计算和分配
    长度(Y)
    ,还是还有更多(矩阵乘法比卷积运算等更有效)
  • 谢谢大家!

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

    您可以自己看到,如果运行此命令,conv确实更高效 代码

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


    卷积矩阵就是一个矩阵,在相乘时,它会给出与卷积相同的结果。它总是一个矩阵

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


    作为类比,考虑一下。众所周知,DFT的计算几乎总是采用非常高效的算法。但如果你愿意,你可以。你永远不会把它用于DFT的实际计算;但从概念上讲,将DFT表示为矩阵乘法有时会有所帮助。例如,这允许我们将DFT视为一个函数。

    在这种情况下,可能需要注意的是,计算卷积的最有效方法通常是通过(快速)傅里叶变换。:-)@A.Donda:效率更高,是的(特别是在硬件加速的情况下),但我相信(取决于实现)DFT方法与标准矩阵乘法相比会导致更大的数值误差。如果我错了,请纠正我。我找不到好的参考资料。@horchler,有意思,我没想到。如果你找到推荐人,请告诉我。
    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