MATLAB: Fill in missing NaNs

fillingnan

I am trying to fill these NaNs following this rule: If there is a single NAN, I want the NAN to be filled in with the average of the numbers before and after. If there is more than one NAN. I want the NAN to be filled in with the nearest number. For example, row 2305 should be the average of 16.3 and 14.8, from 2298 to 2304 should be 16.3, and from 2306 to 2312 should be 14.8.

Best Answer

Try this:
x = [1;2;3;4;nan;nan;nan;nan;nan;5;7;8;nan;nan;nan;nan;11;11;12;nan;nan;nan;15];
bb = regionprops(isnan(x));
idx_nnan = find(~isnan(x));
idx_nan = find(isnan(x));
[~,idx] = min(abs(idx_nan - idx_nnan'), [], 2);
x(idx_nan) = x(idx_nnan(idx));
a = [bb.Centroid];
a(1:2:end) = [];
bb = bb(a==fix(a));
for i=1:numel(bb)
idx_center = bb(i).Centroid(2);
idx = cumsum(bb(i).BoundingBox([2 4])) + [-0.5 0.5];
x(idx_center) = mean(x(idx));
end
Original x:
x =
1
2
3
4
NaN
NaN
NaN
NaN
NaN
5
7
8
NaN
NaN
NaN
NaN
11
11
12
NaN
NaN
NaN
15
New x:
x =
1.0000
2.0000
3.0000
4.0000
4.0000 % <--- nearesr value








4.0000 % <--- nearesr value
4.5000 % average

5.0000 % <--- nearesr value
5.0000 % <--- nearesr value
5.0000
7.0000
8.0000
8.0000 % <--- nearesr value
8.0000 % <--- nearesr value
11.0000 % <--- nearesr value
11.0000 % <--- nearesr value
11.0000
11.0000
12.0000
12.0000 % <--- nearesr value
13.5000 % average
15.0000 % <--- nearesr value
15.0000