2013-06-02 14 views
6

Załóżmy, że mam macierz A, w poniższym formularzu.Sortowanie w porządku rosnącym, ale na bieżąco zeruj

Chcę posortować go w porządku rosnącym, ale na końcu zer.

Wiem, że mogę zastąpić wszystkie zera przy pomocy inf, posortować je i zastąpić ponownie zera zerami, jak zaproponowano w this question.

Myślę, że był prostszy sposób. Przynajmniej odkąd moje zera są już w dolnych rzędach. Czy mogę to zrobić w pojedynczej linii?

Czego chcę:

A = 
    3  1  6 
    35 9  0 
    0  32 0 
    0  0  0 

Dzięki!

UPDATE

Było pytanie dotyczące obciążania Eitan za odpowiedź. Oto wyniki (uśrednione, a po rozgrzewce):

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

można zmienić wszystko "0" do "wartości maksymalnej", potem sortuj, na końcu zamień całą "wartość maksymalną" na "0" –

+0

@RoeeGavirel: Mogę ... Pytanie brzmi: czy mogę tego uniknąć? Wydaje się nieco uciążliwe dla tak prostego zadania. Musiałbym to zrobić: 'A (A == 0) = Inf' najpierw, a' A (A == Inf) = 0' na końcu, przeszukuj macierz dwukrotnie dla tych wartości. (Nie trzeba dodawać, że macierze są nieco większe niż 4x3) =) –

+0

czy zero liczb nie miesza się z liczbami? – evading

Odpowiedz

8

Jeśli można zagwarantować, że Zera są tylko na dole każdej kolumny, można zrobić:

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

przyzwyczajenie, które dają taki sam narzut jak A (A == 0) = Inf pierwszy, i A (A == Inf) = 0 ?? Nonzeros znajduje wszystkie nie-zera, a A ~ = 0 znajduje wszystkie zera. – evading

+1

Dodałem wyniki dwóch metod do pytania. Wygląda na to, że rozwiązanie @ Eitana jest trochę szybsze. –

+1

@RobertP. Dzięki za test porównawczy! –

Powiązane problemy