为什么有时我用“有时”和“有时”来表示;或;在MATLAB中?

为什么有时我用“有时”和“有时”来表示;或;在MATLAB中?,matlab,Matlab,我想检查x是NaN还是inf。如果是,我将其替换为1 if isnan(x) || isinf(x) x = 1; end vs 他们表达“或”都正确吗?它们似乎都能工作,但我不确定,我不知道为什么有时我在MATLAB中使用|和| | for“或”区别在于,当使用exp1 | exp2时,两个表达式都会求值,然后才执行|,而当使用exp1 | | exp2时,只有当exp1为false时,才会对exp2求值。它们并不完全相同。如果左侧的结果足以得出答案,则不计算|的右侧参数。这称为短路

我想检查
x
NaN
还是
inf
。如果是,我将其替换为1

if isnan(x) || isinf(x)
    x = 1;
end
vs


他们表达“或”都正确吗?它们似乎都能工作,但我不确定,我不知道为什么有时我在MATLAB中使用|和| | for“或”

区别在于,当使用exp1 | exp2时,两个表达式都会求值,然后才执行|,而当使用exp1 | | exp2时,只有当exp1为false时,才会对exp2求值。

它们并不完全相同。如果左侧的结果足以得出答案,则不计算
|
的右侧参数。这称为短路,也适用于
&&

对于
|
,始终计算两个参数

此外,
|
返回一个简单的1或0(true或false)

但是
|
计算一个按位OR,因此结果略有不同。对于相应的
&
运算符,这甚至可能是有害的:例如,如果左侧返回二进制
0b01
,右侧返回二进制
0b10
,则尽管两个参数都不是零,但表达式的结果是零


在您的情况下,如果isnan(x)| isinf(x)

则使用
操作符不执行您认为他们会执行的操作。将它们更多地视为二进制掩码的“交集”和“并集”运算符(即,逻辑数组的元素逻辑
以及逻辑
操作)

也许最好用一个例子来说明:

>> A = zeros(10,10); A(2:6,2:6) = 1;
>> B = zeros(10,10); B(4:8,4:8) = 1;
>> subplot(1,3,1); imagesc(A+B); axis image off; title('A + B', 'fontsize', 20);
>> subplot(1,3,2); imagesc(A&B); axis image off; title('A & B', 'fontsize', 20);
>> subplot(1,3,3); imagesc(A|B); axis image off; title('A | B', 'fontsize', 20);

换句话说,这些是在逻辑阵列上操作的普通运算符

相反,
&&
|
是编程构造,称为快捷运算符,用于计算语句<如果两条语句都为真,则代码>&
计算结果为
true
;如果其中一条为真,则
|
计算结果为
true
。它们被称为快捷运算符的原因是,如果左侧的逻辑求值可以保证表达式的结果,而不管右侧的结果如何,则它们提供的编程函数是而不是求值右侧的操作数。因此,它们的输入需要是逻辑表达式,即计算结果为1或0的逻辑标量值(即
true
false

这对于评估可能导致错误的约束非常有用,例如被零或未定义变量除,例如:

>> condition1 = exist('MyVar') && MyVar == 0 % no error
condition1 =
     0

>> condition2 = exist('MyVar') & MyVar == 0  % error
Undefined function or variable 'MyVar'.
if
块用于计算逻辑语句。i、 e.“如果语句x在逻辑上为真,则执行y”。因此,应该使用快捷方式运算符,而不是逻辑数组

数组中的
if
关键字恰好重载(即
if[1,1];disp(1);end
),但这只是为了语法方便,对于更严格的编程,您应该明确结果逻辑表达式应该是什么(例如
if all([1,1]);disp(1);end


另外,请注意,
如果
重载,
断言
则不重载,因此
断言([1,1])
将导致错误,因为
[1,1]
的计算结果不是
(即标量逻辑值1)。如果您试图在
assert
的上下文中使用
&
|
,您可能会把它搞砸。

通常
|
是逻辑OR,而
|
是位OR。也许你应该谢谢你。如果我想执行我的任务,结果是否相同:检查x是NaN还是inf。如果是,我将其替换为1。第二个方法有时会给出错误的答案吗?在这种情况下不会。但我总是使用
|
,除非您需要按位逻辑答案。
|
计算其参数之间的一个;是用于对numbers.PS进行真位
-ing的函数。至于第二个示例,您正在那里执行逻辑索引。回答“它们总是一样的吗?”如果
x
变量不是标量,那么它们不会给出相同的结果。
>> condition1 = exist('MyVar') && MyVar == 0 % no error
condition1 =
     0

>> condition2 = exist('MyVar') & MyVar == 0  % error
Undefined function or variable 'MyVar'.