【问题标题】:ternary operator in matlabmatlab中的三元运算符
【发布时间】:2011-08-01 11:36:27
【问题描述】:

有没有办法输入 if like:

var = (cond) ? true : false;

还是我们必须使用这种格式?

if (cond)
 true
else
 false
end

【问题讨论】:

标签: matlab if-statement ternary-operator conditional-operator


【解决方案1】:

快速而优雅。我会简单地写 tern(a>b, a, b) 缺点是你必须到处复制粘贴,或者在目录中有额外的文件

function b = tern(cond, a, b)
    if cond
        b=a;
    end
end

【讨论】:

    【解决方案2】:

    @Leonid Beschastny 关于内联if-else-end 语句是正确的,但如果必须,那么对于任何可以评估为布尔值的赋值值,都可以使用快捷布尔运算符||&&

    (cond) && ((var=true_val)||1) || (var=false_val);
    

    规则:

    1. 必须使用快捷布尔操作||&&不能 |&
    2. 可用于布尔、数字和字符赋值
    3. 使用元胞数组或函数句柄
    4. 作业必须用括号括起来。
    5. (var=true_val) 后面必须跟||1 以防true_val == false
    6. truefalse 分配可能针对不同的变量(即(var1=true_val)(var2=false_val)
    7. true_valfalse_val 可以是不同的类型,前提是每个类型都可以评估为布尔值

    也可以这样做:

    cond && (func1(..)||1) || func2(...);
    

    如果 func1func2 返回一个可测试的布尔值,不包括任何内容(但不包括元胞数组!):

    【讨论】:

    • 这是哪个 Matlab 版本?我有 R2018a,分配 var=true_val 不起作用。 Matlab 报语法错误。
    【解决方案3】:

    替换

    c = (x ? a : b)
    

    通过

    c = subsref({b; a}, substruct('{}', {x + 1}))
    

    x 应该是一个布尔值或 1 或 0。
    true 或 1 将选择一个
    false 或 0 将选择 b
    这应该适用于所有单元格可以包含的内容,也可以用于复杂的公式!

    【讨论】:

    • 注意:a 和 b 都被评估。这可能与 if ... else ... end 有所不同。
    【解决方案4】:

    我经常使用这种风格:

    cond = what < ever;
    
    n = getfield([23,42], {1+(what < ever)}) % for any 1x1-data
    s = cell2mat(getfield({'no','yes'}, {1+(what < ever)})) % for nonuniform
    

    它足够紧凑,不需要辅助函数

    【讨论】:

      【解决方案5】:

      嗯...没有人提到这个

      fi = @(varargin)varargin{end-varargin{1}}
      

      在文档中某处写着“结束”即将到来,因此这将是更多的未来证明

      fi = @(varargin)varargin{length(varargin)-varargin{1}}
      

      用法:

      fi(input('Do you like Matlab ? '),'yes','no')
      >> no
      

      如果您需要内联案例,请参阅Mathworks ...

      【讨论】:

        【解决方案6】:

        MatLab 没有三元运算符,也没有任何其他用于单行 if 语句的语法糖。但是如果你的 if 语句真的很简单,你也可以只写一行:

        if (cond); casetrue(); else; casefalse(); end
        

        它不像三元运算符那么简单,但还是比用5行代码写的要好。

        【讨论】:

        • 无论多么简单,Matlab 中的 lambda/匿名函数定义都不支持 if/switch/loop 语句。
        【解决方案7】:

        MATLAB 没有条件表达式,但在某些情况下,您可以通过说,例如 var = cond*true_expr + (1-cond)*false_expr 来获得类似的效果。与 C 的条件表达式不同,这当然总是计算 true_exprfalse_expr,如果 cond 恰好不是 0 或 1(注意:false 的行为类似于 0;true 的行为类似于 1)你会得到疯狂的结果。

        【讨论】:

        • 应该可以创建一个接受一个条件和两个函数句柄的函数。然后你就有了想要的快捷方式行为。
        • 优雅但仅适用于数字表达式,我尝试使用字符串并将它们作为 ASCII 值数组返回
        • 如果true_exprfalse_exprinf,这也不起作用
        【解决方案8】:

        如果你只需要真假,你可以按照MatlabSorter的建议去做。如果您想要一个真正的三级运算符(即a = b ? c : d),MATLAB 中没有。但是,使用here 提供的文件,您可以接近。

        【讨论】:

          【解决方案9】:

          你可以的

          var = 5 > 4;
          

          这会将 var 设置为 true。只需将您需要的替换为 5 > 4。

          【讨论】:

          • 不,您可以使用 (a > b) 作为因子,然后添加另一个具有相反语句的产品:var = (a &lt; 0) * (-a) + (a &gt;= 0) * (a)
          • 如果我们需要在 disp 或 fprintf 中使用三元运算符?
          猜你喜欢
          • 1970-01-01
          • 2021-10-06
          • 2021-08-01
          • 2018-09-10
          • 2017-03-09
          相关资源
          最近更新 更多