【问题标题】:Rearranging a matrix by the greatest values of the rows按行的最大值重新排列矩阵
【发布时间】:2013-06-10 01:42:07
【问题描述】:

我正在尝试编写一个接受四个向量的函数。该函数将向量“堆叠”在一起以创建一个有 4 行的矩阵。必须重新排列矩阵,以使数字最大的行位于顶部。然后,在三个底行中找到最大的数字,并将包含它的行放在顶部下方。然后,寻找最大的第二个底线,并放置包含从顶部起第三个位置的线。 函数返回得到的矩阵。

例如:

v1=[1 2 3 4] v2=[5 6 7 8] v3=[9 10 11 12] v4=[13 14 15 16];

输出应该是

m=[13 14 15 16;
    9 10 11 12;
       5 6 7 8; 
       1 2 3 4]

这就是我现在所做的,但它不能正常工作

function [ x ] = re( v1,v2,v3,v4 )

vec=[v1;v2;v3;v4];
[r,y]=size(vec);
h=[];
e=[];
l=[];
p=[];

a=sort(v1,'descend');
b=sort(v2,'descend');
c=sort(v3,'descend');
d=sort(v4,'descend');

elVector=[a(1),b(1),c(1),d(1)];

sortIt=sort(elVector,'descend');

for i=a:d
for j=1:r
if sortIt(1)==i(1)
  h=vec(j,1:y);

for ii=a:d
for jj=1:r
  if sortIt(2)==ii(1)
  e=vec(jj,1:y);

for iii=a:d
for jjj=1:r
  if sortIt(3)==iii(1)
  l=vec(jjj,1:y);

for iiii=a:d
for jjjj=1:r
  if sortIt(4)==iiii(1)
  p=vec(jjjj,1:y);


  end
end
end
  end
end
end
  end
end
end
end
end
end

x=[h;e;l;p];  
end`

编辑:关于评论中的矩阵示例

最后的矩阵应该是这样的:

x =

 0     0    10     0
 0     4     0     0
 0     0     0     2
 0     0     1     0

因此,在顶部具有最大值的向量,在第二行中具有下一个最大值..(10,4,2,1)。

现在在我修复了我之前编写的代码后它可以工作了:

>

 function [ x ] = re( v1,v2,v3,v4 )

vec=[v1;v2;v3;v4];
[r,y]=size(vec);
h=[];
e=[];
l=[];
p=[];

a=sort(vec(1,1:y),'descend');
b=sort(vec(2,1:y),'descend');
c=sort(vec(3,1:y),'descend');
d=sort(vec(4,1:y),'descend');

elVector=[a(1),b(1),c(1),d(1)];
sortIt=sort(elVector,'descend');

for i=1:length(elVector)

      if (sortIt(1))==elVector(i)
      h=vec(i,1:y);

      end

      if (sortIt(2))==elVector(i)
      e=vec(i,1:y);
      end

      if (sortIt(3))==elVector(i)
      l=vec(i,1:y);
      end

      if (sortIt(4))==elVector(i)
      p=vec(i,1:y);

      end
end

x=[h;e;l;p]; 
end

但我仍然想知道matlab中是否有一个函数可以做到这一点。 谢谢你的帮助/

【问题讨论】:

    标签: matlab


    【解决方案1】:

    只需使用sortrows...,因此不需要嵌套循环和多种排序,例如

    A=[v1;v2;v3;v4]
    B = flipud(sortrows(A))
    
    B =
        13    14    15    16
         9    10    11    12
         5     6     7     8
         1     2     3     4
    

    编辑:

    你想要的可以使用:

    [~, IX]=sort(max(A')','descend')
    

    然后

    A(IX,:)
    
    A(IX,:) =
         0     0    10     0
         0     4     0     0
         0     0     0     2
         0     0     1     0
    

    【讨论】:

    • 为什么 flipud(sortrows(A)) 在这个矩阵上不起作用:w = 0 0 1 0 0 0 10 0 0 0 0 2 0 4 0 0
    • w = [0 0 1 0; 0 0 10 0; 0 0 0 2; 0 4 0 0]; flipud(sortrows(w)) 可能不起作用,因为您实际上想对列进行排序,而不是对行进行排序()尽管问题的标题是这样)-您提供的示例矩阵使它很难说是哪个。试试sort(w,'descend')
    猜你喜欢
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多