2013-06-02 47 views
6

Giả sử tôi có ma trận A, trên biểu mẫu sau.Sắp xếp theo thứ tự tăng dần, nhưng giữ số 0 ở cuối

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

Tôi muốn sắp xếp theo thứ tự tăng dần nhưng cuối cùng vẫn giữ số 0.

Tôi biết tôi có thể áp dụng tất cả các số 0 với inf, sắp xếp và thay thế inf s bằng 0 lần nữa, như được đề xuất trong this question.

Tôi nghĩ rằng có một cách đơn giản hơn. Ít nhất là vì số không của tôi đã ở trong các hàng dưới cùng. Tôi có thể làm điều này trong một dòng không?

Những gì tôi muốn:

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

Cảm ơn!

CẬP NHẬT

Có một câu hỏi liên quan đến việc chi phí của câu trả lời Eitan của. Đây là kết quả (tính trung bình, và sau khi khởi động):

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

bạn có thể thay đổi tất cả "0" đến "giá trị tối đa", sau đó sắp xếp, cuối cùng thay thế tất cả "giá trị tối đa" bằng "0" –

+0

@RoeeGavirel: Tôi có thể ... Câu hỏi đặt ra là: Tôi có thể tránh nó không? Nó có vẻ hơi cồng kềnh cho một nhiệm vụ đơn giản như vậy. Tôi sẽ cần phải làm: 'A (A == 0) = Inf' đầu tiên, và' A (A == Inf) = 0' cuối cùng, do đó tìm kiếm thông qua ma trận hai lần cho các giá trị này. (Không cần phải nói, các ma trận lớn hơn một chút so với 4x3) =) –

+0

không có số không được trộn lẫn với các số không? – evading

Trả lời

8

Nếu bạn có thể đảm bảo rằng các số không chỉ ở dưới cùng của mỗi cột, bạn có thể làm:

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

wont rằng cung cấp cho cùng một chi phí như A (A == 0) = Inf đầu tiên, và A (A == Inf) = 0 ?? nonzeros tìm tất cả các số không và A ~ = 0 tìm tất cả các số không. – evading

+1

Tôi đã thêm kết quả của hai phương pháp cho câu hỏi. Có vẻ như giải pháp @ Eitan nhanh hơn một chút. –

+1

@RobertP. Cảm ơn bạn đã chuẩn bị! –

Các vấn đề liên quan