Move all NaN to end of matrix columns.
3 views (last 30 days)
Show older comments
Hampus Alfredsson
on 5 Mar 2018
Commented: Jorge Morales
on 28 Jan 2020
Hi!
I have a 3D matrix of many rows. At som places there is NaN values in the middle of some rows that I don't want there, ex:
A(:,:,1) = [8 8; 9 9; 8 8; 9 9; NaN NaN; 1 1; 2 2; 3 3; 5 5; 7 7];
A(:,:,2) = [2 2; 3 3; 4 4; NaN NaN; NaN NaN; 1 2; 2 5; 3 7; 5 6; 7 8];
I want to remove the NaN's somehow. But since it is a 3D matrix it has to remain the same size and hence I can't just remove all NaN's by setting A(any(any(isnan(A),3),2),:,:) = [].
0 Comments
Accepted Answer
Stephen23
on 5 Mar 2018
Edited: Stephen23
on 5 Mar 2018
Without sorting the other values:
>> A(:,:,1) = [8 8; 9 9; 8 8; 9 9; NaN NaN; 1 1; 2 2; 3 3; 5 5; 7 7];
>> A(:,:,2) = [2 2; 3 3; 4 4; NaN NaN; NaN NaN; 1 2; 2 5; 3 7; 5 6; 7 8];
>> [~,idr] = sort(isnan(A),1);
>> S = size(A);
>> [~,id2,id3] = ndgrid(1:S(1),1:S(2),1:S(3));
>> idx = sub2ind(S,idr,id2,id3);
>> B = A(idx)
B(:,:,1) =
8 8
9 9
8 8
9 9
1 1
2 2
3 3
5 5
7 7
NaN NaN
B(:,:,2) =
2 2
3 3
4 4
1 2
2 5
3 7
5 6
7 8
NaN NaN
NaN NaN
4 Comments
More Answers (2)
M
on 5 Mar 2018
if you want to move all NaN to end of matrix you can use:
sort(A)
ans(:,:,1) =
1 1
2 2
3 3
5 5
7 7
8 8
8 8
9 9
9 9
NaN NaN
ans(:,:,2) =
1 2
2 2
2 3
3 4
3 5
4 6
5 7
7 8
NaN NaN
NaN NaN
Jos (10584)
on 6 Mar 2018
10+ years ago, I submitted the function sortlind to the Matlab File Exchange, which returns linear indices (rather than sub indices as sort does). This is how it works:
[~, I] = sortlind(isnan(A)) ;
B = A(I) ; % all NaNs of A moved to the end
0 Comments
See Also
Categories
Find more on Matrices and Arrays 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!