我想在 MATLAB 中实现信号的二维核卷积。这本质上是信号(非图像)的非线性二次滤波器,如以下公式所述:
其中k2(t1,t2)是二维卷积核。 x 是 1d [N,1] 信号向量,y 是输出 [N,1] 信号。
到目前为止,我一直在通过一种非常暴力、不优雅的方式来做到这一点。我想知道是否可以使用 MATLAB filter2
/conv2
函数更有效地完成此操作!我知道这些函数是用于图像处理的,我对此不太了解,所以我希望有人能提供帮助!
最佳答案
使用 diag(conv2(x,x,k)); 时的问题是您正在计算更大的东西(整个二维矩阵),然后只保留对角线。根据信号的大小,它可能会很昂贵。您可以尝试使用
n = 500; m = 50;
x = rand(n,1);
k2 = rand(m,m);
tic; res1 = diag(conv2(x,x,k2)); toc;
tic;
res2 = zeros(n+m-1,1);
for k = 1:n+m-1
imin = k+1-min(k,m); imax = min(k,n);
jmin = max(1,k-n+1); jmax = min(k,m);
res2(k) = x(imax:-1:imin)'*k2(jmin:jmax,jmin:jmax)*x(imax:-1:imin);
end
toc;
norm(res1-res2)
在我尝试过的许多情况下,它比其他选项运行得更快。例如,一个输出可以是
>> script
Elapsed time is 0.012753 seconds.
Elapsed time is 0.006541 seconds.
ans =
1.5059e-12
我不知道你的信号或内核有多大,所以你可以尝试一下。
关于matlab - MATLAB 中信号的内核 2D 卷积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21686781/