Сортировка в порядке возрастания, но, наконец, держите нули

Предположим, у меня есть матрица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.
 evading02 июн. 2013 г., 13:22
нет ли нулей, смешанных с числами?
 evading02 июн. 2013 г., 13:48
Не будучи уверенным, как ведет себя Matlab под капотом, я думаю,for i = 1:size(A,2) index = A(:,i) ~= 0; A(index, i) = sort(A(index, i)); end будет искать нули только один раз, а затем использовать прямую индексацию ...
 Shai02 июн. 2013 г., 14:17
@RobertP. ты устал?sel = B==0; B(sel)=inf;B=sort(B);B(sel)=0;
 Lee Daniel Crocker02 июн. 2013 г., 13:34
Matlab. Хотя почти каждый язык делает что-то подобное.
 Lee Daniel Crocker02 июн. 2013 г., 13:30
sort () принимает второй аргумент, который является функцией сравнения.
 Stewie Griffin02 июн. 2013 г., 21:58
@ Horchler: Я просто дважды проверил свои результаты, и они нет изменить. Я'м с использованием R2013a, на машине Win-8. Вы'вероятно, прав.nonzeros
 Shai02 июн. 2013 г., 21:42
@ Horchler Я подозреваюnonzeros основывается на редких данных, может быть, тампреобразование в фоновом режиме?
 evading02 июн. 2013 г., 14:19
Хорошо, что я поставил ответ в комментариях, так как у меня явно не было подсказки =)
 Stewie Griffin02 июн. 2013 г., 13:24
@evading: Нет, все они в конце.
 Stewie Griffin02 июн. 2013 г., 14:27
@evading: Ваше решение работает, так что "не имея понятия " Я думаю, это немного сурово =)
 Stewie Griffin02 июн. 2013 г., 13:14
@ RoeeGavirel: я могу ... Вопрос в том, можно ли этого избежать? Это кажется немного громоздким для такой простой задачи. Мне нужно сделать:A(A==0) = Inf во-первых, иA(A==Inf) = 0 в конце, таким образом, ищите в матрице дважды эти значения. (Излишне говорить, что матрицы немного больше, чем 4x3) =)
 Shai02 июн. 2013 г., 13:32
@LeeDanielCrocker - что ??? ты говоришь о Matlab или?std::sort
 Roee Gavirel02 июн. 2013 г., 13:09
Вы можете изменить все "0" к "макс-значение»потом сортируй, в конце концов замени всемакс-значение» с "0"
 horchler02 июн. 2013 г., 21:20
Я получаю разные результаты. @Shai»с хорошей суммой быстрее (0.963290 сек.) чем @Eitan 'с решением (1.240851 с.) - R2012a, OS X 10.8.3, Retina MacBook Pro. Некоторый аспект этого зависит от версии / платформы. Я'буду винитьnonzeros
 Stewie Griffin02 июн. 2013 г., 14:26
@Shai. Спасибо! У меня сейчас и работает нормально. Похоже, ЭйтанРешение немного быстрее, хотя.

Ответы на вопрос(1)

Решение Вопроса

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

A(A ~= 0) = nonzeros(sort(A));
 Eitan T02 июн. 2013 г., 14:07
@RobertP. Спасибо за тест!
 Stewie Griffin02 июн. 2013 г., 14:00
Я добавил результаты двух методов к вопросу. Похоже, @EitanРешение немного быстрее.
 evading02 июн. 2013 г., 13:32
разве это дает те же накладные расходы, что и A (A == 0) = Inf сначала, и A (A == Inf) = 0 ?? ненулевые находят все ненулевые значения, а A ~ = 0 находит все нули.
 Stewie Griffin02 июн. 2013 г., 14:09
@EitanT Спасибо за ответ =)

Ваш ответ на вопрос