Supponiamo di avere una matrice A
, nel seguente modulo.Ordinamento in ordine crescente, ma mantenere gli zeri al momento
A =
35 1 6
3 32 0
0 9 0
0 0 0
Voglio ordinarlo in ordine crescente, ma mantenere gli zeri alla fine.
So che posso subsitute tutti gli zeri con inf
, ordinare, e sostituire le inf
s con gli zeri di nuovo, come proposto nella this question.
Penso che ci fosse un modo più semplice. Almeno poiché i miei zeri sono già nelle file in basso. Posso farlo in una sola riga?
quello che voglio:
A =
3 1 6
35 9 0
0 32 0
0 0 0
Grazie!
UPDATE
C'è stata una domanda per quanto riguarda il sovraccarico di risposta di Eitan. Ecco i risultati (medi, e dopo il warm up):
B = kron(A,ceil(rand(2000)*1000)); % 8000x6000 matrix
C = B;
%% Eitan's solution:
t1 = tic; B(B ~= 0) = nonzeros(sort(B)); toc(t1)
Elapsed time is 1.768782 seconds.
%% From question text:
B = C;
t1 = tic; B(B==0)=Inf; B = sort(B); B(B==Inf)=0; toc(t1)
Elapsed time is 1.938374 seconds.
%% evading's solution (in the comments):
B = C;
t1 = tic; for i = 1:size(B,2) index = B(:,i) ~= 0; B(index, i) = sort(B(index, i)); end
toc(t1)
Elapsed time is 1.954454 seconds.
%% Shai's solution (in the comments):
B = C;
t1 = tic; sel = B==0; B(sel)=inf;B=sort(B);B(sel)=0; toc(t1)
Elapsed time is 1.880054 seconds.
si può cambiare tutto lo "0" a un "valore massimo", quindi ordina, alla fine sostituisci tutto "valore massimo" con "0" –
@RoeeGavirel: Posso ... La domanda è: Posso evitarlo? Sembra un po 'ingombrante per un compito così semplice. Avrei bisogno di fare: 'A (A == 0) = Inf' prima, e' A (A == Inf) = 0' alla fine, quindi cercare nella matrice due volte per questi valori. (Inutile dire che le matrici sono un po 'più grandi di 4x3) =) –
non ci sono zero misti con i numeri? – evading