2013-06-02 2 views
6

다음 형식으로 행렬 A이 있다고 가정합니다.오름차순으로 정렬하지만 마지막으로 0을 유지합니다.

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

오름차순으로 정렬하고 마침내 0을 유지하고 싶습니다.

inf으로 0을 모두 나누어서 정렬하고 this question에 제안 된대로 inf을 다시 0으로 바꿀 수 있다는 것을 알고 있습니다.

더 간단한 방법이 있다고 생각합니다. 내 0이 이미 맨 아래 행에 있기 때문에 적어도. 한 줄로이 작업을 수행 할 수 있습니까?

내가 원하는 것은 :

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

감사합니다!

UPDATE는 에이 탄의 대답의 오버 헤드에 대한 질문이 있었다. 다음은 결과입니다 (평균, 그리고 최대 후 따뜻한) : 당신이 제로가 각 열의 맨 아래에 있음을 보장 할 수있는 경우

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

이 모든 변경할 수 있습니다 "0"을 "최대 값"으로 변경 한 다음 끝에 정렬하면 "최대 값"을 모두 "0"으로 바꿉니다. –

+0

@RoeeGavirel : 나는 할 수 있습니다 ... 질문은 : 그것을 피할 수 있습니까? 그런 간단한 작업에는 약간 성가신 것처럼 보입니다. 나는'A (A == 0) = Inf'를 먼저하고'A (= Inf == 0) = 0'을해야 할 것입니다. (말할 필요도없이, 행렬은 4x3보다 약간 큽니다) =) –

+0

숫자와 혼합 된 0이 없습니다? – evading

답변

8

, 당신은 할 수 있습니다 :

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

은 A (A == 0) = Inf와 같은 오버 헤드를주고 A (A == Inf) = 0 ?? nonzeros는 0이 아닌 모든 값을 찾고 A ~ = 0은 모든 0을 찾습니다. – evading

+1

두 가지 방법의 결과를 질문에 추가했습니다. @ Eitan의 솔루션이 조금 더 빨라 보입니다. –

+1

@RobertP. 벤치 마크에 감사드립니다! –

관련 문제