5

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

4

5 回答 5

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.

于 2013-01-06T15:15:50.740 回答
2

Logical Operators

MATLAB offers three types of logical operators and functions:

  • | is Element-wise — operate on corresponding elements of logical arrays.
    Example: vector inputs A and B

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

    A | B = 11101

  • || is Short-circuit — operate on scalar, logical expressions

    Example:

    || : 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 is 0 after this expression and C is 1.

  • Other is, Bit-wise — operate on corresponding bits of integer values or arrays.
    reference link

于 2013-01-06T15:11:34.527 回答
0

| 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})) 
于 2013-01-06T15:14:16.423 回答
0

||用于标量输入

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

来源: -

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

于 2013-01-06T15:09:39.473 回答
0

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

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

于 2013-01-06T15:16:28.737 回答