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.
można zmienić wszystko "0" do "wartości maksymalnej", potem sortuj, na końcu zamień całą "wartość maksymalną" na "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) =) –
czy zero liczb nie miesza się z liczbami? – evading