Is it possible to sort an array by making the repeated elements in the last?
2 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Mohammad Ayoub
am 21 Feb. 2018
Kommentiert: Mohammad Ayoub
am 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 Kommentare
Akzeptierte Antwort
Stephen23
am 21 Feb. 2018
Bearbeitet: Stephen23
am 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 Kommentare
Jan
am 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!).
Weitere Antworten (2)
KSSV
am 21 Feb. 2018
A = [-2 -2 -1 3 3] ;
s = sign(A) ;
[val,idx] = sort(abs(A)) ;
iwant = s(idx).*val
3 Kommentare
Jan
am 21 Feb. 2018
Bearbeitet: Jan
am 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 Kommentare
Siehe auch
Kategorien
Mehr zu Shifting and Sorting Matrices finden Sie in Help Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!