📄 conv2c.m
字号:
function y = conv2c(x,h)
% Circular 2D convolution
x=wraparound(x,h);
y=conv2(x,h,'valid');
function y = wraparound(x, m)
% Extend x so as to wrap around on both axes, sufficient to allow a
% "valid" convolution with m to return the cyclical convolution.
% We assume mask origin near centre of mask for compatibility with
% "same" option.
[mx, nx] = size(x);
[mm, nm] = size(m);
if mm > mx | nm > nx
error('Mask does not fit inside array')
end
mo = floor((1+mm)/2); no = floor((1+nm)/2); % reflected mask origin
ml = mo-1; nl = no-1; % mask left/above origin
mr = mm-mo; nr = nm-no; % mask right/below origin
me = mx-ml+1; ne = nx-nl+1; % reflected margin in input
mt = mx+ml; nt = nx+nl; % top of image in output
my = mx+mm-1; ny = nx+nm-1; % output size
y = zeros(my, ny);
y(mo:mt, no:nt) = x; % central region
if ml > 0
y(1:ml, no:nt) = x(me:mx, :); % top side
if nl > 0
y(1:ml, 1:nl) = x(me:mx, ne:nx); % top left corner
end
if nr > 0
y(1:ml, nt+1:ny) = x(me:mx, 1:nr); % top right corner
end
end
if mr > 0
y(mt+1:my, no:nt) = x(1:mr, :); % bottom side
if nl > 0
y(mt+1:my, 1:nl) = x(1:mr, ne:nx); % bottom left corner
end
if nr > 0
y(mt+1:my, nt+1:ny) = x(1:mr, 1:nr); % bottom right corner
end
end
if nl > 0
y(mo:mt, 1:nl) = x(:, ne:nx); % left side
end
if nr > 0
y(mo:mt, nt+1:ny) = x(:, 1:nr); % right side
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -