Moving NaN elements from the last columns to the first column, iteratively

Hello community,
I'm struggling to figure out a way to automatize a problem I'm confronting on Matlab. Here is a fictitious matrix that replicates my issue (mine is much bigger, but always has between 0 and 2 NaN observations at the end of the matrix):
A = [1 2 3 4 5 6 7 8 NaN NaN;
1 2 3 4 5 6 7 8 9 NaN;
1 2 3 4 5 6 7 8 9 10]
For those rows that have NaNs, I want to move the NaN observations to the front of the matrix, so as to have this;
A = [NaN NaN 1 2 3 4 5 6 7 8;
NaN 1 2 3 4 5 6 7 8 9;
1 2 3 4 5 6 7 8 9 10]
This is a code which works for me with a row vector (i.e A = [1 2 3 4 5 6 7 8 NaN NaN]):
while isnan(A(end))
A = A(1:end-1);
A = [NaN,A];
end
I can't seem to figure out how to broaden the loop to the general case presented above (the 3x10 matrix).
Thank you!

 Accepted Answer

The simplest way would be to loop through the rows:
i = isnan(A);
for j = 1:size(A,1)
A(j,:) = [A(j,i(j,:)) A(j,~i(j,:))];
end
Another approach:
a1 = A';
[~, ord] = sort(~isnan(a1));
ord2 = ord + repmat(0:size(a1,1):numel(a1)-1, size(a1,1),1);
a2 = a1(ord2)'

3 Comments

Cheers! I'll have a look at this code now and tell you whether it works!
Works.... great! Thank you so much TADA

Sign in to comment.

More Answers (1)

Do you want your numeric values in ascending order? If so you should be able to do the following:
A = sort(A,2,'MissingPlacement','first');

1 Comment

No, not necessarily. The 1 2 3 ..... 9 were just examples of numbers, but they need not be in ascending order. The order should just be maintained when moving the NaNs to the front.

Sign in to comment.

Categories

Products

Release

R2017b

Asked:

on 10 Jun 2019

Commented:

on 11 Jun 2019

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!