-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathunpadarray.m
More file actions
85 lines (74 loc) · 2.08 KB
/
unpadarray.m
File metadata and controls
85 lines (74 loc) · 2.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%UNPADARRAY crops data from the borders of an array
%%function B = unpadarray(A, unpadsize, direction)
%%
%%INPUT:
%% A - array of any dimension
%% unpadsize - vector of nonnegative integers
%% direction - 'pre', 'post', or 'both' (the default)
%%
%%OUTPUT:
%% B - unpadded or cropped array
%%
%%EXAMPLES:
%% A = reshape(1:1000, [10 10 10]);
%% B = unpadarray(A, 2, 'pre');
%% B = unpadarray(A, [0 2 3], 'both');
%% B = unpadarray(A, [0 2 3]); % same
%% B = unpadarray(A, 0); % unchanged
%% B = unpadarray(A); % unchanged
%% B = unpadarray(A, 11, 'pre'); % empty array
%% B = unpadarray(A, 1.5); % error
%% B = unpadarray(A, -1); % error
%% B = unpadarray(A, [1 1 1 1]); % error for 3d array
%%
%%DESCRIPTION:
%% UNPADARRAY does the opposite of builtin PADARRAY. It unpads an
%% array like PADARRAY pads them. See the help in PADARRAY for more
%% information.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function A = unpadarray(A, unpadsize, direction)
narginchk(1,3);
if nargin<3
direction = 'both';
end
if nargin<2
return;
end
unpadsize = unpadsize(:);
if any(unpadsize<0)
error('unpadsize needs to be a vector of non-negative integers.');
end
numdims = numel(unpadsize);
asize = size(A);
adims = length(asize);
if numdims>adims
error('unpadarray::Number of unpad dimensions exceeds array.');
end
if numdims<adims
unpadsize(adims) = 0;
end
idx = cell(adims,1);
for k = 1:adims
M = asize(k);
p = unpadsize(k);
if p~=0
switch direction
case 'pre'
idx{k} = 1+p:M;
case 'post'
idx{k} = 1:M-p;
case 'both'
idx{k} = 1+p:M-p;
otherwise
error('unpadarray::Directions are pre, post, or both.');
end
else
idx{k} = ':';
end
end
S.type = '()';
S.subs = idx;
%S = struct('type', '()', 'subs', idx);
A = subsref(A, S);
%A = A(idx{:});