我正在尝试编写一个接受四个向量的函数。函数将向量“堆叠”在一起以创建具有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中是否有一个函数可以做到这一点。 谢谢你的帮助/
答案 0 :(得分:2)
只需使用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