2013-06-02 15 views
6

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. 
+0

si può cambiare tutto lo "0" a un "valore massimo", quindi ordina, alla fine sostituisci tutto "valore massimo" con "0" –

+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) =) –

+0

non ci sono zero misti con i numeri? – evading

risposta

8

Se è possibile garantire che gli zeri sono solo nella parte inferiore di ogni colonna, si può fare:

A(A ~= 0) = nonzeros(sort(A)); 
+0

non danno lo stesso overhead di A (A == 0) = Inf prima e A (A == Inf) = 0 ?? nonzeros trova tutti i non-zero e A ~ = 0 trova tutti gli zeri. – evading

+1

Ho aggiunto i risultati dei due metodi alla domanda. @ La soluzione di Eitan è un po 'più veloce. –

+1

@RobertP. Grazie per il punto di riferimento! –

Problemi correlati