📄 impad.m
字号:
function b = impad(varargin)
%IMPAD Pad array.
% SLE, July 1997
% Copyright 1993-1998 The MathWorks, Inc. All Rights Reserved.
% $Revision: 1.6 $ $Date: 1997/11/24 16:20:15 $
[a, padSize, method, params, msg] = ParseInputs(varargin{:});
if (~isempty(msg))
error(msg);
end
b = feval(method, a, padSize, params{:});
if (islogical(a))
b = logical(b);
end
%%%
%%% constant
%%%
function b = constant(a, padSize, padValue)
% Extend a by a constant value (default = 0).
if (nargin < 3)
padValue = 0;
end
% Initialize output array to have the correct size, class, and
% initial value.
numDims = length(padSize);
sizeA = size(a);
if (length(sizeA) < numDims)
sizeA = [sizeA ones(1,numDims - length(sizeA))];
end
sizeB = sizeA + 2*padSize;
b = repmat(feval(class(a), padValue), sizeB);
% Form index vectors to subsasgn input array into output array.
idx = cell(numDims,1);
for k = 1:numDims
idx{k} = (1:sizeA(k)) + padSize(k);
end
b(idx{:}) = a;
%%%
%%% symmetric
%%%
function b = symmetric(a, padSize)
if (isempty(a))
sizeB = zeros(1,length(padSize));
for k = 1:length(sizeB)
% This computation is in a loop because padSize might be
% longer than sizeB.
sizeB(k) = size(a,k) + 2*padSize(k);
end
b = feval(class(a), zeros(sizeB));
else
numDims = length(padSize);
idx = cell(numDims,1);
for k = 1:numDims
M = size(a,k);
dimNums = [1:M M:-1:1];
p = padSize(k);
idx{k} = dimNums(mod([-p:-1 0:M-1 M:M+p-1], 2*M) + 1);
end
b = a(idx{:});
end
%%%
%%% replicate
%%%
function b = replicate(a, padSize)
%REPLICATE Extend matrix by replicating rows and columns.
if (isempty(a))
sizeB = zeros(1,length(padSize));
for k = 1:length(sizeB)
% This computation is in a loop because padSize might be
% longer than sizeB.
sizeB(k) = size(a,k) + 2*padSize(k);
end
b = feval(class(a), zeros(sizeB));
else
numDims = length(padSize);
idx = cell(numDims,1);
for k = 1:numDims
M = size(a,k);
onesVector = ones(1,padSize(k));
idx{k} = [onesVector 1:M M*onesVector];
end
b = a(idx{:});
end
%%%
%%% ParseInputs
%%%
function [a, padSize, method, params, msg] = ParseInputs(varargin)
a = [];
padSize = [];
method = 'constant';
params = {};
msg = '';
if (nargin < 2)
msg = 'Too few input arguments';
return;
end
a = varargin{1};
padSize = varargin{2};
if (~isnumeric(a))
msg = 'Invalid input image';
return;
end
if (nargin >= 3)
if (ischar(varargin{3}))
% IMPAD(A,padSize,'method',params...)
method = lower(varargin{3});
methodStrings = {'replicate'; 'symmetric'; 'constant'};
idx = strmatch(method, methodStrings);
if (isempty(idx))
msg = sprintf('Unknown method string "%s"', method);
return;
elseif (length(idx) > 1)
msg = sprintf('Ambiguous method string "%s"', method);
return;
else
method = methodStrings{idx};
end
params = varargin(4:end);
else
% IMPAD(A,padSize,padVal)
method = 'constant';
params = {varargin{3}};
end
end
if (isempty(padSize))
msg = 'Pad size must not be empty.';
return
end
if (min(size(padSize)) ~= 1)
msg = 'Pad size must be a vector.';
return
end
if (isequal(size(padSize), [1 1]))
% Turn N into [N N].
padSize = [padSize padSize];
end
% Add trailing zeros if necessary.
if (ndims(a) > length(padSize))
padSize = [padSize(:)' zeros(1,ndims(a)-length(padSize))];
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -