2013-01-06 130 views
5

是什么在MATLAB中|||逻辑运算符之间的区别?|有什么区别?和||在MATLAB中?

+1

查看文档:http://www.mathworks.co.uk/help/matlab/matlab_prog/operators.html#f0-38948。 –

+3

相关问题:[在MATLAB中&和&&有什么区别?](http://stackoverflow.com/questions/1379415/whats-the-difference-between-and-in-matlab) –

回答

0

||用于标量输入

|取阵列输入中的if/while语句

source: -

始终使用& &和||需要短路时的操作人员。 使用的elementwise运营商(&和|)用于短路可以 产生意想不到的结果。

+1

这不完全准确。 –

2

逻辑运算符

MATLAB提供三种类型的逻辑operatorsfunctions

  • |是逐元素 - 在相应的逻辑阵列的元素进行操作。
    实施例: 矢量输入AB

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

    A | B = 11101

  • ||是短路 - 标量操作,逻辑表达式

    实施例:

    ||:返回逻辑1(真),如果任一输入,或两者,求值为真,并且逻辑0(假)如果他们不。

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

    A || B(如果A为假乙只计算)

    A = 1; B = 0;

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

    B0该表达式和C is 1之后。

  • 其他是,逐位 - 在对应的整数值或阵列的位进行操作。
    reference link

0

|表示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})) 
+0

这重复了问题中提到的信息。 –

+0

我在移动网络上出现了一个吓人的网络,甚至没有看到有其他答案。有人可以在我的文章中格式化代码。 – bonCodigo

+0

很好,我想我必须自己做。这是另一篇你可能想看的文章。当我走到一台机器前时,我会格式化这篇文章。 http://stackoverflow.com/questions/1379415/whats-the-difference-between-and-in-matlab – bonCodigo

5

我确定您已阅读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) 

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

关于短路评估的更多讨论,请参考Wikipedia article的主题。

+3

+1:值得注意的是,'|'可以在数组上操作,而'||'只能在标量上操作。此外,[Loren Shure](http://blogs.mathworks.com/loren/)指出[这里](http://stackoverflow.com/a/1393606/1336150)'''也可能短路( !!),但只在'if' /'while'语句中。 –

0

短路||表示仅在必要时才会评估参数。 在我们的示例expr1 || expr2中,如果expr1的计算结果为TRUE,则不需要评估第二个操作数 - 结果将始终为TRUE。如果你有一个长链短路操作员A || B || C || D,你的第一个评估为真,那么其他人将不会被评估。

如果您将元素逻辑|替换为A | B | C | D,则将评估所有元素,而不管先前的操作数如何。

相关问题