【问题标题】:How does the following syntax may be shortened and improved?如何缩短和改进以下语法?
【发布时间】:2017-07-10 18:54:58
【问题描述】:

在 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];

谢谢。

【问题讨论】:

    标签: matlab loops if-statement optimization syntax


    【解决方案1】:

    我可以提供一种更短的解​​决方案,但如果您希望它完全矢量化,则必须等待更熟练的人。代码如下:

    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 列中条目较小的行。或者您也可以保留它@ 987654324@ 并切换第 4 行的元素,即max([A(ii-1,9),A(ii,9)])

    【讨论】:

    • OP 需要 rowsSELECTED_A 是一个 6x13 矩阵。
    • 没问题。 max 将索引作为第二个返回值返回。使用它来选择所需的行。
    • 不应该 [ind,~][~, ind] 吗? :)
    • @Jørgen 是的,对于所有这些错误,我很抱歉,我很兴奋终于看到了一个我可以真正回答的问题!
    猜你喜欢
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 2012-04-25
    • 2020-05-26
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多