# Last non nan observation

168 views (last 30 days)
joseph Frank on 18 Feb 2012
Hi,
I have a matrix and I want to find in each column the last non nan observation. Is there a neat way of doing it quickly? Regards

jiro on 18 Feb 2012
I'm not sure if you're looking for the indices (row number) or the actual value of the last non nan observation. So here are both:
B = ~isnan(A);
% indices
Indices = arrayfun(@(x) find(B(:, x), 1, 'last'), 1:size(A, 2));
% values
Values = arrayfun(@(x,y) A(x,y), Indices, 1:size(A, 2));
##### 1 CommentShowHide None
Sven on 18 Feb 2012
This will hit a snag if any column is _all_ NaN (the arrayfun will be returning non-uniform output), but otherwise works great.

### More Answers (2)

Oleg Komarov on 18 Feb 2012
sum(~isnan(A))
##### 2 CommentsShowHide 1 older comment
Oleg Komarov on 18 Feb 2012
You're right. I don't know what I was thinking about.

Sven on 18 Feb 2012
Here I can plug a file exchange entry:
Im = rand(50);
Im(Im>.7) = nan;
lastNans = find_ndim(~isnan(Im),1,'last')
To quote: I = FIND_NDIM(BW,DIM,'last') returns the subscripts of the last nonzero elements of BW along the dimension DIM.
The solution hijacks the max() function... it's only a few lines but it packages up things nicely (such as returning 0 if no NaNs were found in a column) - hope you like it.
And if you don't want to use the function itself you can get your answer with just the relevant lines as follows:
BW = ~isnan(Im);
[~, foundPx] = max(BW,[],1);
foundPx = size(BW,1)+1 - foundPx; % Need to count backwards to get last non-zero
foundPx(~any(BW,dim)) = 0; % Account for all-zero entries by setting output to 0