Move all NaN to end of matrix columns.
3 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Hampus Alfredsson
el 5 de Mzo. de 2018
Comentada: Jorge Morales
el 28 de En. de 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 comentarios
Respuesta aceptada
Stephen23
el 5 de Mzo. de 2018
Editada: Stephen23
el 5 de Mzo. de 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 comentarios
Más respuestas (2)
M
el 5 de Mzo. de 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)
el 6 de Mzo. de 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 comentarios
Ver también
Categorías
Más información sobre Matrices and Arrays en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!