MATLAB Answers

gd94
0

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

Asked by gd94
on 10 Jun 2019
Latest activity Commented on by TADA
on 11 Jun 2019
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!

  0 Comments

Sign in to comment.

2 Answers

Answer by TADA
on 10 Jun 2019
Edited by TADA
on 11 Jun 2019
 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.


Answer by Bob Nbob
on 10 Jun 2019

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.