Is it possible to sort an array by making the repeated elements in the last?
2 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
Mohammad Ayoub
il 21 Feb 2018
Commentato: Mohammad Ayoub
il 21 Feb 2018
Greetings.
Consider a vector A = [-2 -2 -1 3 3], is it possible to sort this vector (a generalized method) to [-1 -2 -2 -3 -3]?
The only thing that matters is that the repeated elements are in the last, it doesn't matter what way the repeated elements themselves are sorted (for example, [-1 -2 -2 -3 -3] or [-1 -3 -3 -2 -2] are fine) I just want the distinct value to be on the left before any repeated value.
Thank you in advance,
M. Ayoub
0 Commenti
Risposta accettata
Stephen23
il 21 Feb 2018
Modificato: Stephen23
il 21 Feb 2018
>> A = [-2,-2,-1,3,3,3,9,9,0,99]
A =
-2 -2 -1 3 3 3 9 9 0 99
>> [cnt,idx] = histc(A,unique(A));
>> [~,idy] = sort(cnt>1);
>> [~,idz] = ismember(idx,idy);
>> [~,ids] = sort(idz);
>> B = A(ids)
B =
-1 0 99 -2 -2 3 3 3 9 9
And
>> A = [-1,-1,-3,-5,-5]
...
B =
-3 -5 -5 -1 -1
2 Commenti
Jan
il 21 Feb 2018
This sorts in unique, twice in sort and again in ismember. In addition the perfectly working histc is deprecated (what a pity!).
Più risposte (2)
KSSV
il 21 Feb 2018
A = [-2 -2 -1 3 3] ;
s = sign(A) ;
[val,idx] = sort(abs(A)) ;
iwant = s(idx).*val
3 Commenti
Jan
il 21 Feb 2018
Modificato: Jan
il 21 Feb 2018
A = [-1 -1 -3 -5 -5];
[b, n] = RunLength(sort(A));
m = (n == 1);
result = [b(m), RunLength(b(~m), n(~m)];
If you do not have a C-compiler installed, use RunLength_M from this submission.
Maybe this is faster:
sA = sort(A);
[b, n, index] = RunLength(sA);
mask = false(size(A));
mask(index(n == 1)) = true;
result = [sA(mask), sA(~mask)];
0 Commenti
Vedere anche
Categorie
Scopri di più su Shifting and Sorting Matrices in Help Center e File Exchange
Prodotti
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!