【问题标题】:What's the difference between | and || in MATLAB?有什么区别 |和 ||在 MATLAB 中?
【发布时间】:2012-12-20 10:34:31
【问题描述】:

MATLAB 中的||| 逻辑运算符有什么区别?

【问题讨论】:

标签: matlab logical-operators short-circuiting


【解决方案1】:

|| 用于标量输入

| 在 if/while 语句中接受数组输入

来自source:-

始终使用 && 和 ||需要短路时的操作员。 使用元素运算符(& 和 |)进行短路可以 产生意想不到的结果。

【讨论】:

  • 这并不完全准确。
【解决方案2】:

逻辑运算符

MATLAB 提供三种逻辑operatorsfunctions

  • | 是 Element-wise — 对逻辑数组的相应元素进行操作。
    示例: 向量输入 AB

    A = [0 1 1 0 1]; B = [1 1 0 0 1];

    一个 | B = 11101

  • || 是短路 - 对标量、逻辑表达式进行操作

    例子:

    || :如果任一输入或两者的计算结果为真,则返回逻辑 1 (true),否则返回逻辑 0 (false)。

    操作数: 包含标量值的逻辑表达式。

    A || B(仅当 A 为假时才评估 B)

    A = 1; B = 0;

    C =(A || (B = 1));

    B 在这个表达式之后是 0C is 1

  • 其他的是,按位 - 对整数值或数组的相应位进行操作。
    reference link

【讨论】:

    【解决方案3】:

    |OR 表示为logical operator|| 也是一个逻辑运算符,称为short-circuit OR

    短路运算符最重要的优点是,您可以仅在满足某些条件时使用它们来计算表达式。例如,您希望仅当函数文件位于当前 MATLAB 路径上时才执行函数。当找不到文件 myfun.m 时,短路可防止以下代码生成错误:

     comp = (exist('myfun.m') == 2) && (myfun(x) >= y)
    

    同样,此语句避免尝试除以零:

    x = (b ~= 0) && (a/b > 18.5)
    

    您还可以在ifwhile 语句中使用&&|| 运算符来利用它们的短路行为:

    if (nargin >= 3) && (ischar(varargin{3})) 
    

    【讨论】:

    • 我在移动设备上的网络被吓坏了,甚至没有看到其他答案。有人可以格式化我帖子中的代码吗?
    • 太好了,我想我必须自己做。这是您可能想查看的另一篇文章。当我到达机器前面时,我会格式化帖子。 stackoverflow.com/questions/1379415/…
    【解决方案4】:

    我确定您已经阅读了 short-circuiting operatorselement-wise operators 的文档。

    一个重要的区别是元素运算符可以对数组进行操作,而短路运算符仅适用于标量逻辑操作数。

    但可能关键的区别在于短路问题。对于短路运算符,表达式从左到右进行计算,一旦可以确定最终结果,则不计算其余项。

    例如,考虑

    x = a && b
    

    如果a 的计算结果为false,那么我们知道a && b 的计算结果为false,而与b 的计算结果无关。所以没有必要评估b

    现在考虑这个表达式:

    NeedToMakeExpensiveFunctionCall && ExpensiveFunctionCall
    

    我们认为ExpensiveFunctionCall 需要很长时间来评估。如果我们可以执行一些其他廉价的测试,允许我们跳过对ExpensiveFunctionCall 的调用,那么我们就可以避免调用 ExpensiveFunctionCall。

    因此,假设 NeedToMakeExpensiveFunctionCall 的计算结果为 false。在这种情况下,因为我们使用了短路操作符,ExpensiveFunctionCall 将不会被调用。

    相反,如果我们使用逐元素运算符并这样编写函数:

    NeedToMakeExpensiveFunctionCall & ExpensiveFunctionCall
    

    那么对ExpensiveFunctionCall 的调用将永远不会被跳过。

    事实上,我希望你已经阅读了MATLAB documentation,其中包含一个很好的例子,很好地说明了这一点:

    x = (b ~= 0) && (a/b > 18.5)
    

    在这种情况下,如果b 为零,我们将无法执行a/b。因此测试b ~= 0。短路运算符的使用意味着我们避免在b 为零时计算a/b,从而避免可能出现的运行时错误。显然,逐元素逻辑运算符无法避免运行时错误。

    有关短路评估的详细讨论,请参阅有关该主题的Wikipedia article

    【讨论】:

    • +1:值得一提的是| 也可以对数组进行操作,而|| 只能对标量进行操作。此外,Loren Shure 指出here | 也可以短路(!!),但仅限于if/while 语句。
    【解决方案5】:

    短路|| 意味着,只有在表达式中必须对参数进行评估。 在我们的示例expr1 || expr2 中,如果expr1 的计算结果为TRUE,则不需要计算第二个操作数——结果将始终为TRUE。如果您有一长串短路运算符A || B || C || D 并且您的第一个评估结果为真,那么其他人将不会被评估。

    如果您将元素逻辑 | 替换为 A | B | C | D,则无论之前的操作数如何,都会计算所有元素。

    【讨论】:

      猜你喜欢
      • 2013-03-26
      • 2016-02-20
      • 2012-01-14
      • 2015-05-24
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      • 2013-05-17
      • 2011-04-26
      相关资源
      最近更新 更多