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.

 Akzeptierte Antwort

Jos (10584)
Jos (10584) am 20 Dez. 2013
Bearbeitet: Jos (10584) am 20 Dez. 2013

0 Stimmen

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 Kommentar

Image Analyst
Image Analyst am 20 Dez. 2013
Sebastiano's "Answer" moved here since it's a comment, not an answer:
Thanks a lot, it works perfectly!

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (4)

Jos (10584)
Jos (10584) am 20 Dez. 2013
Bearbeitet: Jos (10584) am 20 Dez. 2013

2 Stimmen

A=[20 10 NaN 66 NaN 12]
B = sort(A,'descend')
A(~isnan(A)) = B(~isnan(B))
Azzi Abdelmalek
Azzi Abdelmalek am 20 Dez. 2013
Bearbeitet: Azzi Abdelmalek am 20 Dez. 2013

1 Stimme

A=[20 10 NaN 66 NaN 12]
idx=~isnan(A);
B=sort(A,'descend');
B(isnan(B))=[];
A(idx)=B
Jan
Jan am 20 Dez. 2013
Bearbeitet: Jan am 20 Dez. 2013

1 Stimme

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 Kommentar

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 ;

Melden Sie sich an, um zu kommentieren.

Sebastiano delre
Sebastiano delre am 20 Dez. 2013

0 Stimmen

I am sorry. Actually I wrongly state my problem. I have A=[6 20; 10 10; 3 NaN; 20 66; 4 NaN; 7 12] and I would like to get A=[20 66; 6 20; 3 NaN; 7 12; 4 NaN; 10 10]. This means I would like to sort the rows of the matrix in a descending order based on the second column and without moving the rows with the NaN elements in the second column. I would like to use sortrows. Sorry again. Alessio.

Kategorien

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by