我正在尝试在MATLAB中对矩阵进行一堆滚动求和。为了避免循环,我使用repmat
将我的2D矩阵分层为3D结构。但是,现在快速卷积函数conv2
不能再用于累加器。然而,N维卷积函数(convn
)不是我正在寻找的,因为它实际上卷积了所有3个维度。我想要在每个切片上进行2D卷积并返回3D矩阵的东西。
在2D中平铺矩阵而不是在3D中分层它们将无法工作,因为它会破坏卷积边缘情况。我可以在两者之间用零填充但是它开始变得有点混乱。
换句话说,如果没有for循环,我该如何执行以下操作:
{{1}}
提前感谢您的帮助!
答案 0 :(得分:6)
convn将使用n维矩阵和2维滤波器。简单地:
A = ones(5,5,5);
B = convn(A, ones(2), 'same');
答案 1 :(得分:3)
您可以使用某些padding with zeros
和reshaping
-
%// 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
看到的行为相同。