sorting without moving NaNs
9 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Sebastiano delre
le 20 Déc 2013
Commenté : Image Analyst
le 20 Déc 2013
How can I sort an array without moving the NaN elements?
I have A=[20 10 NaN 66 NaN 12] and I would like to get A=[66 20 NaN 12 NaN 10]. Thank you for your help. Alessio.
0 commentaires
Réponse acceptée
Jos (10584)
le 20 Déc 2013
Modifié(e) : Jos (10584)
le 20 Déc 2013
Use a variant of the same trick:
A=[6 20; 10 10; 3 NaN; 20 66; 4 NaN; 7 12]
B = flipud(sortrows(A,[2 1])) ; % descending sortrows based on 2nd column
A(~isnan(A(:,2)),:) = B(~isnan(B(:,2)),:)
1 commentaire
Image Analyst
le 20 Déc 2013
Sebastiano's "Answer" moved here since it's a comment, not an answer:
Thanks a lot, it works perfectly!
Plus de réponses (4)
Jos (10584)
le 20 Déc 2013
Modifié(e) : Jos (10584)
le 20 Déc 2013
A=[20 10 NaN 66 NaN 12]
B = sort(A,'descend')
A(~isnan(A)) = B(~isnan(B))
0 commentaires
Azzi Abdelmalek
le 20 Déc 2013
Modifié(e) : Azzi Abdelmalek
le 20 Déc 2013
A=[20 10 NaN 66 NaN 12]
idx=~isnan(A);
B=sort(A,'descend');
B(isnan(B))=[];
A(idx)=B
0 commentaires
Jan
le 20 Déc 2013
Modifié(e) : Jan
le 20 Déc 2013
If A is large and contains a lot of NaN's, excluding them from the sorting can save some time:
A = [20 10 NaN 66 NaN 12]
idx = ~isnan(A);
A(idx) = sort(A(idx), 'descend');
1 commentaire
Jos (10584)
le 20 Déc 2013
I doubt that excluding NaNs is faster, Jan. Increasing the proportion of NaNs seems to have little effect, or even a positive effect sometimes:
a = randperm(1e7) ; a(a(1:1e1)) = NaN ; tic ; sort(a) ; toc ;
a = randperm(1e7) ; a(a(1:1e5)) = NaN ; tic ; sort(a) ; toc ;
Voir également
Catégories
En savoir plus sur Logical dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!