Сортировать по возрастанию, но сохранить нули, наконец

Предположим, у меня есть матрица A, на следующей форме.

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

Я хочу отсортировать его в порядке возрастания, но сохранить нули наконец.

Я знаю, что могу подсчитать все нули с inf, отсортируйте его и замените infs с нулями снова, как предложено в этот вопрос.

Я бы подумал, что есть более простой способ. По крайней мере, поскольку мои нули уже в нижних рядах. Могу я сделать это в одной строке?

Что Я хочу:

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

спасибо!

обновление

был вопрос относительно накладных расходов на ответ Эйтана. Вот результаты (усредненные, и после разминки):

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.

1 ответов


Если вы можете гарантировать, что нули находятся только в нижней части каждого столбца, вы можете сделать:

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