【发布时间】: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;
我有两个问题:
- 如果可以依赖
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
您可以看到 conv 的速度提高了大约 120 倍。有几个 出现这种情况的原因,但最重要的可能是 conv 是 (几乎)一个内置的编译函数,而 convmtx 是在 MATLAB 中编码的 语言并在调用时被解释(即,它被解析,受到 层类型检查等)。此外,当您调用 convmtx 时,您会创建许多 输入数组的副本,即使您真的只需要一个。
【问题讨论】:
标签: matlab matrix convolution