Movmean skipping NaN in array
Show older comments
I have an array
x = [20 10 5 NaN]; %and I now use:
movmean([x; x(1, :)], [0 1], 1, 'omitnan', 'Endpoints', 'discard')
to calculate the mean, [15 7.5 5 20].
I would like to get [15 7.5 12.5 NaN] so skip over NaN and calculate the mean of 20 and 5 as well, instead of having NaN being replaced by 20 after using movmean. What is the best way to do this?
Answers (1)
Not sure where the 12.5 is coming from but maybe you'd like this:
x = [20, 10, 5, NaN];
kernel = [1,1];
xs = x;
xs(isnan(x)) = 0;
theSum = conv(xs, kernel, 'same')
theCount = conv(~isnan(x), kernel, 'same')
output = theSum ./ theCount
5 Comments
Adam Danz
on 27 Mar 2022
I believe the 12.5 comes from averaging 5 and 20 in [20,10,5,NaN,20] while ignoring the NaN but that left me wondering where the NaN came from in the expected results.
Image Analyst
on 28 Mar 2022
So what's the rule? Always tack on the first element to the end? Or just tack it on if the last element is nan?
What's the use case here? What's the real world situation we need to model? I'mm just not sure why this special endpoint handling is needed, or if it even is needed.
What if there are nan's of various lengths sprinkled throughout the array? Like what if the array is 10000 long but there is a stretch of 10 nan's in there? Do we just want to remove all nan's in the array and take pairs of what's left? If not, then what would go into that stretch of 10 nan's? Do we "fix them" with an interpolated value like you'd get with interp1() or regionfill() and then do a moving 2-element averaging window after that?
Image Analyst
on 28 Mar 2022
So now I'm getting confused. Do you have a row vector, or a 2-D matrix? You've shown both.
sr9497
on 28 Mar 2022
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!