Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何使用一维卷积实现二维卷积?_Matlab_Convolution - Fatal编程技术网

Matlab 如何使用一维卷积实现二维卷积?

Matlab 如何使用一维卷积实现二维卷积?,matlab,convolution,Matlab,Convolution,假设 u = [1 2 1 3 ; 1 2 1 3 ; 1 2 1 3]; v = [2 0 1 ; 2 0 1 ; 2 0 1]; 我想实现 w = conv2(u, v); % [2 4 3 8 1 3 ; 4 8 6 16 2 6 ; 6 12 9 24 3 9 ; 4 8 6 16 2 6 ; 2 4 3 8 1 3] 假设我不想使用conv2() 使用Matlab,我发现 w1 = conv([1 2 1 3], [2 0 1]) % [2 4 3 8 1 3] w2 =

假设

u = [1 2 1 3 ; 1 2 1 3 ; 1 2 1 3];
v = [2 0 1 ; 2 0 1 ; 2 0 1];
我想实现

w = conv2(u, v);    % [2 4 3 8 1 3 ; 4 8 6 16 2 6 ; 6 12 9 24 3 9 ; 4 8 6 16 2 6 ; 2 4 3 8 1 3]
假设我不想使用
conv2()

使用Matlab,我发现

w1 = conv([1 2 1 3], [2 0 1])   % [2 4 3 8 1 3]
w2 = conv([1 2 1 3], [2 0 1])   % [2 4 3 8 1 3]
w3 = conv([1 2 1 3], [2 0 1])   % [2 4 3 8 1 3]
x = [2 ; 2 ; 2]
y = [1 ; 1 ; 1]
z = conv(x, y); % [2 ; 4 ; 6 ; 4 ; 2];

x = [4 ; 4 ; 4]
y = [1 ; 1 ; 1]
z = conv(x, y); % [4 ; 8 ; 12 ; 8 ; 4];

x = [3 ; 3 ; 3]
y = [1 ; 1 ; 1]
z = conv(x, y); % [3 ; 6 ; 9 ; 6 ; 3];

x = [8 ; 8 ; 8]
y = [1 ; 1 ; 1]
z = conv(x, y); % [8 ; 16 ; 24 ; 16 ; 8];

x = [1 ; 1 ; 1]
y = [1 ; 1 ; 1]
z = conv(x, y); % [1 ; 2 ; 3 ; 2 ; 1];

x = [3 ; 3 ; 3]
y = [1 ; 1 ; 1]
z = conv(x, y); % [3 ; 6 ; 9 ; 6 ; 3];
因此,我们得到:

w123 = [w1 ; w2 ; w3]           % [2 4 3 8 1 3 ; 2 4 3 8 1 3 ; 2 4 3 8 1 3];
使用Matlab,我还发现

w1 = conv([1 2 1 3], [2 0 1])   % [2 4 3 8 1 3]
w2 = conv([1 2 1 3], [2 0 1])   % [2 4 3 8 1 3]
w3 = conv([1 2 1 3], [2 0 1])   % [2 4 3 8 1 3]
x = [2 ; 2 ; 2]
y = [1 ; 1 ; 1]
z = conv(x, y); % [2 ; 4 ; 6 ; 4 ; 2];

x = [4 ; 4 ; 4]
y = [1 ; 1 ; 1]
z = conv(x, y); % [4 ; 8 ; 12 ; 8 ; 4];

x = [3 ; 3 ; 3]
y = [1 ; 1 ; 1]
z = conv(x, y); % [3 ; 6 ; 9 ; 6 ; 3];

x = [8 ; 8 ; 8]
y = [1 ; 1 ; 1]
z = conv(x, y); % [8 ; 16 ; 24 ; 16 ; 8];

x = [1 ; 1 ; 1]
y = [1 ; 1 ; 1]
z = conv(x, y); % [1 ; 2 ; 3 ; 2 ; 1];

x = [3 ; 3 ; 3]
y = [1 ; 1 ; 1]
z = conv(x, y); % [3 ; 6 ; 9 ; 6 ; 3];
这意味着,如果我们使用内核
[2 0 1]
u
的每一行执行1D卷积,然后使用内核
[1;1;1]
对每一列应用1D卷积,我们得到:

2  4  3  8  1  3
4  8  6 16  2  6
6 12  9 24  3  9
4  8  6 16  2  6
2  4  3  8  1  3
所以,我的问题是,这个
[1;1;1]
来自哪里


而且,最重要的是,如果行不相同会发生什么?

我想是因为矩阵
v
正好是同一行的3倍。因此,您只需在列上使用第二次卷积
[1]
,因为您的矩阵
v
正好是同一行的3倍。因此,您可以简单地在列上使用第二次卷积
[1]

因为您的一维卷积结合起来可以得到与二维卷积相同的结果,这是因为您的滤波器是正确的。SteveEddins在他的MATLAB博客上讨论了可分离卷积

您的过滤器是可分离的,因为:

[1;1;1] * [2,0,1] = 

   2   0   1
   2   0   1
   2   0   1

但一般来说,并非所有二维滤波器都是可分离的,只有那些可分离的滤波器才能转换为单独的一维卷积。

一维卷积结合在一起产生与二维卷积相同的结果的原因是滤波器是可分离的。SteveEddins在他的MATLAB博客上讨论了可分离卷积

您的过滤器是可分离的,因为:

[1;1;1] * [2,0,1] = 

   2   0   1
   2   0   1
   2   0   1

但总的来说,,并非所有2D滤波器都是可分离的,只有那些可分离的2D滤波器才能转换为单独的1D卷积。

如果它们不相同怎么办?未经测试我假设如果行只是彼此的线性组合,那么您可以使用这种方法为每行使用适当的因子。如果它们不相同怎么办?未经测试我假设行是只需要彼此的线性组合,然后您就可以使用这种方法,并为每一行使用适当的因子。您当天的搜索词是@bicker,因此,简而言之:一般来说,从1d conv无法实现2d卷积。除非内核是可分离的。这是correct@beaker,发表你的评论作为回答,我会接受。你当天的搜索词是。@bicker,所以,简而言之:一般来说,2d卷积不能从1d conv实现。除非内核是可分离的。这是correct@beaker,将你的评论作为回答,我会接受的。