다음 형식으로 행렬 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.
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"으로 바꿉니다. –
@RoeeGavirel : 나는 할 수 있습니다 ... 질문은 : 그것을 피할 수 있습니까? 그런 간단한 작업에는 약간 성가신 것처럼 보입니다. 나는'A (A == 0) = Inf'를 먼저하고'A (= Inf == 0) = 0'을해야 할 것입니다. (말할 필요도없이, 행렬은 4x3보다 약간 큽니다) =) –
숫자와 혼합 된 0이 없습니다? – evading