MATLAB中|
和||
逻辑运算符之间有什么区别?
答案 0 :(得分:5)
我确定您已阅读short-circuiting operators和element-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
的测试。使用短路运算符意味着我们避免在a/b
为零时计算b
,从而避免出现运行时错误。显然,元素逻辑运算符无法避免运行时错误。
有关短路评估的详细讨论,请参阅主题的Wikipedia article。
答案 1 :(得分:2)
逻辑运算符
MATLAB提供三种类型的逻辑operators
和functions
:
|
是元素化的 - 对逻辑数组的相应元素进行操作
示例:强>
向量输入A
和B
A = [0 1 1 0 1]; B = [1 1 0 0 1];
A | B = 11101
||
是短路的 - 对标量逻辑表达式进行操作
示例:
||
:如果任一输入或两者都评估为真,则返回逻辑1(真),如果不是,则返回逻辑0(假)。
操作数:包含标量值的逻辑表达式。
A
|| B
(仅在A为假时评估B)
A = 1;
B = 0;
C =(A || (B = 1));
B
为0
C is 1
。
其他是,按位 - 对整数值或数组的相应位进行操作 reference link
答案 2 :(得分:0)
||
用于标量输入
|
在if / while语句中接受数组输入
来自source: -
始终使用&&和||需要短路时的操作员。 使用元素运算符(&和|)进行短路即可 产生意想不到的结果。
答案 3 :(得分: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)
您还可以使用&&
和||
语句中的if
和while
运算符来利用其短路行为:
if (nargin >= 3) && (ischar(varargin{3}))
答案 4 :(得分:0)
短路||
表示仅在表达式中必须评估参数。
在我们的示例expr1 || expr2
中expr1
评估为TRUE
,而不需要评估第二个操作数 - 结果将始终为TRUE
。如果您有一长串短路操作符A || B || C || D
并且您的第一个评估为真,那么其他人将不会被评估。
如果将元素逻辑|
替换为A | B | C | D
,则无论以前的操作数如何,都将评估所有元素。