MATLAB中的逻辑运算符|
和逻辑运算符有什么区别?||
5 回答
I'm sure you've read the documentation for the short-circuiting operators, and for the element-wise operators.
One important difference is that element-wise operators can operate on arrays whereas the short-circuiting operators apply only to scalar logical operands.
But probably the key difference is the issue of short-circuiting. For the short-circuiting operators, the expression is evaluated from left to right and as soon as the final result can be determined for sure, then remaining terms are not evaluated.
For example, consider
x = a && b
If a
evaluates to false
, then we know that a && b
evaluates to false
irrespective of what b
evaluates to. So there is no need to evaluate b
.
Now consider this expression:
NeedToMakeExpensiveFunctionCall && ExpensiveFunctionCall
where we imagine that ExpensiveFunctionCall
takes a long time to evaluate. If we can perform some other, cheap, test that allows us to skip the call to ExpensiveFunctionCall
, then we can avoid calling ExpensiveFunctionCall.
So, suppose that NeedToMakeExpensiveFunctionCall
evaluates to false
. In that case, because we have used short-circuiting operators, ExpensiveFunctionCall
will not be called.
In contrast, if we used the element-wise operator and wrote the function like this:
NeedToMakeExpensiveFunctionCall & ExpensiveFunctionCall
then the call to ExpensiveFunctionCall
would never be skipped.
In fact the MATLAB documentation, which I do hope you have read, includes an excellent example that illustrates the point very well:
x = (b ~= 0) && (a/b > 18.5)
In this case we cannot perform a/b
if b
is zero. Hence the test for b ~= 0
. The use of the short-circuiting operator means that we avoid calculating a/b
when b
is zero and so avoid the run-time error that would arise. Clearly the element-wise logical operator would not be able to avoid the run-time error.
For a longer discussion of short-circuit evaluation, refer to the Wikipedia article on the subject.
Logical Operators
MATLAB offers three types of logical operators
and functions
:
|
is Element-wise — operate on corresponding elements of logical arrays.
Example: vector inputsA
andB
A = [0 1 1 0 1]; B = [1 1 0 0 1];
A | B = 11101
||
is Short-circuit — operate on scalar, logical expressionsExample:
||
: Returns logical 1 (true) if either input, or both, evaluate to true, and logical 0 (false) if they do not.Operand: logical expressions containing scalar values.
A
||B
(B is only evaluated if A is false)A = 1;
B = 0;
C =(A || (B = 1));
B
is0
after this expression andC is 1
.Other is, Bit-wise — operate on corresponding bits of integer values or arrays.
reference link
|
represents OR
as a logical operator. ||
is also a logical operator called a short-circuit OR
The most important advantage of short-circuit operators is that you can use them to evaluate an expression only when certain conditions are satisfied. For example, you want to execute a function only if the function file resides on the current MATLAB path. Short-circuiting keeps the following code from generating an error when the file, myfun.m, cannot be found:
comp = (exist('myfun.m') == 2) && (myfun(x) >= y)
Similarly, this statement avoids attempting to divide by zero:
x = (b ~= 0) && (a/b > 18.5)
You can also use the &&
and ||
operators in if
and while
statements to take advantage of their short-circuiting behavior:
if (nargin >= 3) && (ischar(varargin{3}))
短路||
意味着,只有在表达式中必要时才会评估参数。在我们的示例中,expr1 || expr2
如果expr1
计算结果为TRUE
,则无需计算第二个操作数 - 结果将始终为TRUE
。如果您有一长串短路运算符A || B || C || D
并且您的第一个评估为真,那么其他人将不会被评估。
如果您将 Element-wise logical 替换|
为,A | B | C | D
则将评估所有元素,而不管先前的操作数如何。