Сортировка в порядке возрастания, но, наконец, держите нули
Предположим, у меня есть матрицаA
в следующей форме.
A =
35 1 6
3 32 0
0 9 0
0 0 0
Я хочу отсортировать их в порядке возрастания, но, наконец, держу нули.
Я знаю, что могу заменить все нули сinf
отсортировать и заменитьinf
снова с нулями, как предложено вэтот вопрос.
Я думаю, что есть более простой способ. По крайней мере, так как мои нули уже в нижних рядах. Могу ли я сделать это в одной строке?
Что я хочу:
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.