据我所知,如果我们有两个向量-say X和Y,我们可以使用Z = conv(X, Y)
在Matlab中计算它们的卷积。还有另一种方法,即as described on Mathworks.com,通过卷积矩阵:
n = length(Y);
Z = convmtx(X,n)*Y;
我有两个问题:
conv(X, Y)
?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
你可以看到转速提高了大约120倍。还有一些 原因就是这种情况,但最重要的可能是转义 (几乎)内置编译函数,而convmtx在MATLAB中编码 语言并在被调用时被解释(即,它被解析,受到一个 类型检查层等)。此外,当您调用convmtx时,您会创建许多 输入数组的副本,即使你真的只需要一个。
答案 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。