3D矩阵切片的2D卷积

时间:2015-04-30 16:18:08

标签: matlab matrix convolution

我正在尝试在MATLAB中对矩阵进行一堆滚动求和。为了避免循环,我使用repmat将我的2D矩阵分层为3D结构。但是,现在快速卷积函数conv2不能再用于累加器。然而,N维卷积函数(convn)不是我正在寻找的,因为它实际上卷积了所有3个维度。我想要在每个切片上进行2D卷积并返回3D矩阵的东西。

在2D中平铺矩阵而不是在3D中分层它们将无法工作,因为它会破坏卷积边缘情况。我可以在两者之间用零填充但是它开始变得有点混乱。

换句话说,如果没有for循环,我该如何执行以下操作:

{{1}}

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:6)

convn将使用n维矩阵和2维滤波器。简单地:

A = ones(5,5,5);
B = convn(A, ones(2), 'same');

答案 1 :(得分:3)

您可以使用某些padding with zerosreshaping -

%// Store size parameters
[m,n,r] = size(A)  
[m1,n1] = size(kernel) 

%// Create a zeros padded version of the input array. We need to pad zeros at the end
%// rows and columns to replicate the convolutionoperation around those boundaries
Ap = zeros(m+m1-1,n+n1-1,r);
Ap(1:m,1:n,:) = A;

%// Reshape the padded version into a 3D array and apply conv2 on it and
%// reshape back to the original 3D array size
B_vect = reshape(conv2(reshape(Ap,size(Ap,1),[]),kernel,'same'),size(Ap))

%// Get rid of the padded rows and columns for the final output
B_vect = B_vect(1:m,1:n,:);

基本思想是将输入的3D阵列重新整形为2D阵列,然后在其上应用2D卷积。填充需要额外的步骤,以便与边界周围conv2看到的行为相同。