如何在不使用排序的情况下保持零

时间:2013-08-14 11:52:07

标签: matlab

我有一个像下面这样的矩阵 -

x=[1 1 1 1 1;
   2 1 1 1 0;
   3 3 1 0 0;
   3 2 2 0 0];

但我想让这个矩阵像 -

 x=[2 2 3 0 0;
    1 3 3 0 0;
    1 1 1 2 0;
    1 1 1 1 1];

我已经尝试过“升序”,但是“0”将首先出现,但我想在最后保持“0”并制作一个矩阵,其中“1”的数量将在整个矩阵中从低到高我正在尝试但不能这样做。 我需要Matlab专家的帮助。

1 个答案:

答案 0 :(得分:5)

要在结尾处获得零,请将它们设置为无穷大(inf),排序然后将它们设置为零

x=[1 1 1 1 1;
   2 1 1 1 0;
   3 3 1 0 0;
   3 2 2 0 0]

x(x == 0) = inf;
y = sort(x, 2, 'ascend');
y(y==inf) = 0;

现在计算每行1的数量,并从最少到最多重新排序

[~, I] = sort(sum(y==1,2));

y(I, :)

ans =

   2   2   3   0   0
   1   3   3   0   0
   1   1   1   2   0
   1   1   1   1   1

修改

示例数据含糊不清。以此为输入:

x=[1 1 1 1 1;
   2 1 1 1 0;
   7 1 0 1 0;
   3 3 1 0 0;
   3 2 2 0 0];

现在,Moshen的答案(即在排序行后对每列进行排序)返回

x =

   2   3   7   0   0
   1   2   3   0   0
   1   1   3   0   0
   1   1   1   2   0
   1   1   1   1   1

而我的回归

ans =

   2   2   3   0   0
   1   3   3   0   0
   1   1   7   0   0
   1   1   1   2   0
   1   1   1   1   1

我保留了行的完整性。但目前尚不清楚OP的回答是什么。