Fill NaNs in array with last value
5 views (last 30 days)
Show older comments
Hi all, thanks for your help. I have a double array and I want to fill NaN values with the last value.
Example:
[321 nan() nan() nan() nan() 55 nan() nan() nan() 22 nan() 21 nan() nan()]
desired result
[321 321 321 321 321 55 55 55 55 22 22 21 21 21]
Also I want to do this same thing with a cell array of strings with blanks instead of NaN. I'm trying to avoid ugly for loops here. This seems familiar... maybe it was a cody question I couldn't solve. Thanks again.
0 Comments
Accepted Answer
Sean de Wolski
on 1 Oct 2013
Edited: Sean de Wolski
on 1 Oct 2013
You still have to figure out what to do if the first value is nan.
v = [321 nan() nan() nan() nan() 55 nan() nan() nan() 22 nan() 21 nan() nan()];
idx = (~isnan(v)); %non nans
vr = v(idx); %v non nan
v2 = vr(cumsum(idx)) %use cumsum to build index into vr
3 Comments
More Answers (1)
Jan
on 1 Oct 2013
Edited: Jan
on 1 Oct 2013
What's wrong with FOR loops?
data = [321 nan() nan() nan() nan() 55 nan() nan() nan() 22 nan() 21 nan() nan()];
for k = find(isnan(data))
data(k) = data(k - 1);
end
But here a vectorized version:
notNaN = ~isnan(data);
index = find(notNaN);
fillup = zeros(size(data));
fillup(notNaN) = index - [0, diff(index)];
result = data(cumsum(fillup));
Much uglier than the loop. I cannot test this currently. You have to care for initial NaNs in addition. And Sean's solution is nicer.
2 Comments
Khaing Zin Htwe
on 10 May 2016
if true
% data = [321 nan() nan() nan() nan() 55 ;nan() nan() nan() 22 nan() 21; nan() nan() 3 66 5 8];
end
I want to fill with integer zeros to NaN values,sir. How can I do it? please help me.
Shruti Verma
on 6 Aug 2017
Edited: Shruti Verma
on 6 Aug 2017
This should do it :)
data(isnan(data)) = 0;
See Also
Categories
Find more on Numeric Types in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!