You are on page 1of 6

1/9/12 12:09 PM

C:\MATLAB7\toolbox\images\images\padarray.m

1 of 6

function b = padarray(varargin) %PADARRAY Pad an array. % B = PADARRAY(A,PADSIZE) pads array A with PADSIZE(k) number of zeros % along the k-th dimension of A. PADSIZE should be a vector of % positive integers. % % B = PADARRAY(A,PADSIZE,PADVAL) pads array A with PADVAL (a scalar) % instead of with zeros. % % B = PADARRAY(A,PADSIZE,PADVAL,DIRECTION) pads A in the direction % specified by the string DIRECTION. DIRECTION can be one of the % following strings. % % String values for DIRECTION % 'pre' Pads before the first array element along each % dimension . % 'post' Pads after the last array element along each % dimension. % 'both' Pads before the first array element and after the % last array element along each dimension. % % By default, DIRECTION is 'both'. % % B = PADARRAY(A,PADSIZE,METHOD,DIRECTION) pads array A using the % specified METHOD. METHOD can be one of these strings: % % String values for METHOD % 'circular' Pads with circular repetion of elements. % 'replicate' Repeats border elements of A. % 'symmetric' Pads array with mirror reflections of itself. % % Class Support % ------------% When padding with a constant value, A can be numeric or logical. % When padding using the 'circular', 'replicate', or 'symmetric' % methods, A can be of any class. B is of the same class as A. % % Example % ------% Add three elements of padding to the beginning of a vector. The % padding elements contain mirror copies of the array. % % b = padarray([1 2 3 4],3,'symmetric','pre') % % Add three elements of padding to the end of the first dimension of % the array and two elements of padding to the end of the second % dimension. Use the value of the last array element as the padding % value. % % B = padarray([1 2; 3 4],[3 2],'replicate','post') % % Add three elements of padding to each dimension of a

1/9/12 12:09 PM % % % % % % % % % %

C:\MATLAB7\toolbox\images\images\padarray.m Each pad element contains the value 0.

2 of 6

three-dimensional array. A B C D = = = =

[1 2; 3 4]; [5 6; 7 8]; cat(3,A,B) padarray(C,[3 3],0,'both')

See also CIRCSHIFT, IMFILTER. Copyright 1993-2003 The MathWorks, Inc. $Revision: 1.11.4.3 $ $Date: 2003/08/23 05:53:08 $

[a, method, padSize, padVal, direction] = ParseInputs(varargin{:}); if isempty(a), % treat empty matrix similar for any method if strcmp(direction, 'both' ) sizeB = size(a) + 2*padSize; else sizeB = size(a) + padSize; end b = mkconstarray(class(a), padVal, sizeB); else switch method case 'constant' b = ConstantPad(a, padSize, padVal, direction); case 'circular' b = CircularPad(a, padSize, direction); case 'symmetric' b = SymmetricPad(a, padSize, direction); case 'replicate' b = ReplicatePad(a, padSize, direction); end end if (islogical(a)) b = logical(b); end %%% %%% ConstantPad %%% function b = ConstantPad(a, padSize, padVal, direction) numDims = numel(padSize); % Form index vectors to subsasgn input array into output array.

1/9/12 12:09 PM

C:\MATLAB7\toolbox\images\images\padarray.m

3 of 6

% Also compute the size of the output array. idx = cell(1,numDims); sizeB = zeros(1,numDims); for k = 1:numDims M = size(a,k); switch direction case 'pre' idx{k} = (1:M) + padSize(k); sizeB(k) = M + padSize(k); case 'post' idx{k} = 1:M; sizeB(k) = M + padSize(k); case 'both' idx{k} = (1:M) + padSize(k); sizeB(k) = M + 2*padSize(k); end end % Initialize output array with the padding value. Make sure the % output array is the same type as the input. b = mkconstarray(class(a), padVal, sizeB); b(idx{:}) = a;

%%% %%% CircularPad %%% function b = CircularPad(a, padSize, direction) numDims = numel(padSize); % Form index vectors to subsasgn input array into output array. % Also compute the size of the output array. idx = cell(1,numDims); for k = 1:numDims M = size(a,k); dimNums = 1:M; p = padSize(k); switch direction case 'pre' idx{k} = dimNums(mod(-p:M-1, M) + 1); case 'post' idx{k} = dimNums(mod(0:M+p-1, M) + 1); case 'both' idx{k} = dimNums(mod(-p:M+p-1, M) + 1); end

1/9/12 12:09 PM end b = a(idx{:});

C:\MATLAB7\toolbox\images\images\padarray.m

4 of 6

%%% %%% SymmetricPad %%% function b = SymmetricPad(a, padSize, direction) numDims = numel(padSize); % Form index vectors to subsasgn input array into output array. % Also compute the size of the output array. idx = cell(1,numDims); for k = 1:numDims M = size(a,k); dimNums = [1:M M:-1:1]; p = padSize(k); switch direction case 'pre' idx{k} = dimNums(mod(-p:M-1, 2*M) + 1); case 'post' idx{k} = dimNums(mod(0:M+p-1, 2*M) + 1); case 'both' idx{k} = dimNums(mod(-p:M+p-1, 2*M) + 1); end end b = a(idx{:}); %%% %%% ReplicatePad %%% function b = ReplicatePad(a, padSize, direction) numDims = numel(padSize); % Form index vectors to subsasgn input array into output array. % Also compute the size of the output array. idx = cell(1,numDims); for k = 1:numDims M = size(a,k); p = padSize(k); onesVector = ones(1,p); switch direction case 'pre' idx{k} = [onesVector 1:M]; case 'post' idx{k} = [1:M M*onesVector];

1/9/12 12:09 PM

C:\MATLAB7\toolbox\images\images\padarray.m

5 of 6

case 'both' idx{k} = [onesVector 1:M M*onesVector]; end end b = a(idx{:}); %%% %%% ParseInputs %%% function [a, method, padSize, padVal, direction] = ParseInputs(varargin) % default a method padSize padVal direction values = []; = 'constant' ; = []; = 0; = 'both' ;

checknargin(2,4,nargin,mfilename); a = varargin{1}; padSize = varargin{2}; checkinput(padSize, { 'double' }, { 'real' 'vector' 'nonnan' 'nonnegative' ... 'integer' }, mfilename, 'PADSIZE' , 2); % Preprocess the padding size if (numel(padSize) < ndims(a)) padSize = padSize(:); padSize(ndims(a)) = 0; end if nargin > 2 firstStringToProcess = 3; if ~ischar(varargin{3}) % Third input must be pad value. padVal = varargin{3}; checkinput(padVal, { 'numeric' 'logical' }, {'scalar' }, ... mfilename, 'PADVAL' , 3); firstStringToProcess = 4; end for k = firstStringToProcess:nargin validStrings = { 'circular' 'replicate' 'symmetric' 'pre' ... 'post' 'both' }; string = checkstrs(varargin{k}, validStrings, mfilename, ... 'METHOD or DIRECTION' , k);

1/9/12 12:09 PM

C:\MATLAB7\toolbox\images\images\padarray.m

6 of 6

switch string case { 'circular' 'replicate' 'symmetric' } method = string; case { 'pre' 'post' 'both' } direction = string; otherwise error( 'Images:padarray:unexpectedError' , '%s' , ... 'Unexpected logic error.' ) end end end % Check the input array type if strcmp(method, 'constant' ) && ~(isnumeric(a) || islogical(a)) id = sprintf( 'Images:%s:badTypeForConstantPadding' , mfilename); msg1 = sprintf( 'Function %s expected A (argument 1)' ,mfilename); msg2 = 'to be numeric or logical for constant padding.' ; error(id, '%s\n%s' ,msg1,msg2); end

You might also like