-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathlastNaN.m
70 lines (49 loc) · 1.57 KB
/
lastNaN.m
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
function [last_idx, out] = lastNaN (in,varargin)
p = inputParser;
default_dim = 1;
validScalarPosNum = @(x) isnumeric(x) && isscalar(x) && (x > 0);
%validMatrixShape = @(x) isnumeric(x) && (size(x,1) ==1) && (size(x,2) == 2);
addRequired(p,'in',@ismatrix);
addOptional(p,'dim',default_dim,validScalarPosNum);
parse(p,in,varargin{:});
in = p.Results.in;
dim = p.Results.dim;
size_in = size(in);
test_size = size_in(1)*size_in(2);
if test_size == 0
error('array is empty')
end
if numel(size_in) == 3
error('Cant compute last NaN for 3D array')
end
loop_out = zeros(1,size_in(2));
for ii = 1:size_in(2)
if size_in(1) == 1
test_array = in(1,:);
nan_test = ~isnan(test_array);
loop_out(1,ii) = nnz(nan_test);
elseif size_in(2) == 1
test_array = in(:,1);
nan_test = ~isnan(test_array);
loop_out(1,ii) = nnz(nan_test);
elseif numel(size_in) == 2 && dim == 2
test_array = in(ii,:);
nan_test = ~isnan(test_array);
loop_out(1,ii) = nnz(nan_test);
elseif numel(size_in) == 2 && dim == 1
test_array = in(:,ii);
nan_test = ~isnan(test_array);
loop_out(1,ii) = nnz(nan_test);
end
end
last_idx = max(loop_out);
if size_in(1) == 1
out = in(1,1:last_idx);
elseif size_in(2) == 1
out = in(1:last_idx,1);
elseif numel(size_in) == 2 && dim == 2
out = in(:,1:last_idx);
elseif numel(size_in) == 2 && dim == 1
out = in(1:last_idx,:);
end
end