Move all NaN to end of matrix columns.
3 次查看(过去 30 天)
显示 更早的评论
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 个评论
采纳的回答
Stephen23
2018-3-5
编辑:Stephen23
2018-3-5
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 个评论
更多回答(2 个)
M
2018-3-5
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)
2018-3-6
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 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Matrices and Arrays 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!