【问题标题】:Vectorize IF statement向量化 IF 语句
【发布时间】:2015-10-06 02:37:27
【问题描述】:

我正在尝试在 Matlab 中对 if 语句进行矢量化,但我不知道该怎么做。我想为正值分配“N”,为负值分配“S”。我想避免 for 循环,但这是我的代码:

LatDD = [23.0,12.3,-43.2,9.9,-40.7];
LatDir = ['' '' '' '' ''];
if (LatDD < 0)
    LatDir = 'S'
else
    LatDir = 'N'
end

显然这不能满足我的要求,因为它实际上只检查 LatDD 的第一个元素。我可以轻松地做一个 for 循环,但我希望它被矢量化。我尝试了逻辑索引,但我得到的只是另一个带有 0 或 1 的向量,无论如何我都必须用 for 循环检查。

【问题讨论】:

    标签: matlab vectorization


    【解决方案1】:

    你可以在这里使用逻辑索引,你只需要做两次

    LatDD = [23.0,12.3,-43.2,9.9,-40.7];
    LatDir = ['' '' '' '' ''];
    
    LatDir(LatDD < 0) = 'S';
    LatDir(LatDD >= 0) = 'N';
    

    由于您在这里有一个二元选择,您甚至可以通过使用所有'N' 预填充LatDir 并将与负LatDD 值对应的那些更改为'S' 来跳过一个步骤

    LatDD = [23.0,12.3,-43.2,9.9,-40.7];
    LatDir = ['N' 'N' 'N' 'N' 'N'];
    
    LatDir(LatDD < 0) = 'S';
    

    【讨论】:

    • 完美运行!谢谢
    【解决方案2】:

    这是一个单行 -

    char('S'*(LatDD<0) + 'N'*(~(LatDD<0)))
    

    示例运行 -

    >> LatDD = [23.0,12.3,-43.2,9.9,-40.7];
    >> LatDir = ['' '' '' '' ''];
    >> char('S'*(LatDD<0) + 'N'*(~(LatDD<0)))
    ans =
    NNSNS
    

    【讨论】:

    • 这也有效,但对于像我这样的初学者来说,它是令人困惑的。谢谢你的回答。它可以帮助我和其他人学习技巧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 2023-03-20
    • 2020-11-23
    相关资源
    最近更新 更多