如何缩短和改进以下语法?

时间:2017-02-21 08:43:30

标签: matlab loops if-statement optimization syntax

给定Matlab中的12 x 13矩阵,我需要在第9列中选择每两行最大值的行,并创建一个包含所选行的矩阵。下面的代码完成了这项工作,但我想知道如何改进和缩短这种语法。

A = rand(12,13);

a = A(1:2,:);
if a(1,9) > a(2,9)
    a = A(1,:);
else   
    a = A(2,:);
end

b = A(3:4,:);
if b(1,9) > b(2,9)
    b = A(3,:);
else
    b = A(4,:);
end

c = A(5:6,:);
if c(1,9) > c(2,9)
    c = A(5,:);
else
    c = A(6,:);
end

d = A(7:8,:);
if d(1,9) > d(2,9)
    d = A(7,:);
else
    d = A(8,:);
end

e = A(9:10,:);
if e(1,9) > e(2,9)
    e = A(9,:);
else
    e = A(10,:);
end

f = A(11:12,:);
if f(1,9) > f(2,9)
    f = A(11,:);
else
    f = A(12,:);
end

SELECTED_A = [a;b;c;d;e;f];

谢谢。

1 个答案:

答案 0 :(得分:3)

我可以提供一种更短的解​​决方案,但是如果你想要它完全矢量化,你将不得不等待一个更熟练的人。这是代码:

A=rand(12,13);
B=zeros(6,13); % preallocate solutionarray
for ii=2:2:12 % loop through every (second) row
   [~,ind]=max([A(ii,9),A(ii-1,9)]); % check which element is greater
   B(ii/2,:)=A(ii-(ind==2),:); % select corresponding row
end

这将为您提供一个数组B,其中包含您要查找的值。

编辑:代码中有一点缺陷:代码的第5行中的条件需要为ind==2,否则它将始终选择第9列中较小条目的行。或者您也可以离开它ind==1并切换第4行中的元素,即max([A(ii-1,9),A(ii,9)])