ara*_*lar 5 matlab matrix convolution
我知道如果我们有两个向量-例如X和Y,我们可以使用在Matlab中计算它们的卷积Z = conv(X, Y)。如在Mathworks.com上所述,还有另一种方法可以通过卷积矩阵来实现:
n = length(Y);
Z = convmtx(X,n)*Y;
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
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
Run Code Online (Sandbox Code Playgroud)
您可以看到conv的速度提高了大约120倍。有几种原因,但最重要的可能是conv是(几乎)内置编译函数,而convmtx是在MATLAB语言,并在调用时进行解释(即,对其进行解析,进行类型检查等)。此外,即使您确实只需要一个副本,当您调用convmtx时,您也会创建输入数组的许多副本。
卷积矩阵只是乘法后将产生与卷积相同结果的矩阵。它始终是Toeplitz矩阵。
卷积矩阵不适用于卷积的实际计算。它的应用是在需要将卷积表示为矩阵乘法的情况下。
作为类比,考虑离散傅里叶变换(DFT)。众所周知,DFT几乎总是使用非常高效的FFT算法进行计算。但是,您可以根据需要将DFT表示为矩阵。您永远不会将其用于DFT的实际计算。但是从概念上讲,它有时有助于将DFT表示为矩阵乘法。例如,这允许人们将DFT视为向量空间中基础的变化。
| 归档时间: |
|
| 查看次数: |
3272 次 |
| 最近记录: |