我试着找出执行卷积的最好方法。
我有一个3D矩阵I=N x M x P和一个2D矩阵S=1 x 1 x K x P。对于我的3D矩阵的每个第p帧(第三维),我想返回I(:,:,p-K/2:p+K/2)和S(1,1,:,p)之间的有效卷积。你有办法做到这一点吗?
事实上,在计算非常接近于标准卷积的运算次数方面,不同之处在于我需要为每一帧更改第二个矩阵……
这是我目前使用的方法:
% I = 3D matrix [N x M x P]
% S = Filter [1 x 1 x K x P] (K is an odd number)
% OUT = Result
[N, M, P] = size(I); % Data size
K = size(S, 3); % Filter length
win = (K-1)/2 ; % Window
OUT = zeros(size(I)); % Pre-allocation
for p = win+1:P-win
OUT(:, :, p) = convn(I(:, :, p-win:p+win), S(1, 1, :, p), 'valid'); % Perform convolution
end最后,我们有与标准卷积相同的运算次数,唯一的区别是每帧的滤波器是不同的……
有什么想法吗?
谢谢;)
发布于 2017-10-21 10:01:29
因此,您希望将NxMxK子映像与1x1xKx1内核进行卷积,然后只提取有效部分,即NxM映像。
让我们看一下针对单个(x,y)位置的操作。这个一维卷积,你只保留1个值,等同于子图像和你的内核的点积:
OUT(x,y,p) = squeeze(I(x,y,p-win:p+win))' * squeeze(S(1,1,:,p))这可以通过将I的子图重塑为(N*M)xK矩阵(K是水平的,S是列向量)来向量化所有(x,y)。
在所有p中重复此操作最容易使用循环实现,就像您现在所做的那样。另一种方法是创建一个更大的S,其中每列都移位1,这样您就可以在两个矩阵之间进行单个点积。但是创建S也很费钱,大概也需要一个循环。我不认为在MATLAB中避免循环是很重要的(多年来它变得更快了),而且产品本身可能是算法中最昂贵的部分。
https://stackoverflow.com/questions/46847659
复制相似问题