为什么有时我用“有时”和“有时”来表示;或;在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'.