我想检查x
是NaN
还是inf
。如果是,我将其替换为1.
if isnan(x) || isinf(x)
x = 1;
end
vs
x(isnan(x)|isinf(x)) = 1;
他们是否正确表达"或"?似乎他们都工作但我不确定,我不知道为什么有时候我会使用|有时候||为"或"在MATLAB?
答案 0 :(得分:8)
它们并不完全相同。如果左侧的结果足以产生答案,则不评估||
的右手参数。这称为短路,也适用于&&
。
对于|
,始终会评估这两个参数。
此外,||
返回简单的1或0(真或假)。
但|
计算按位 OR,因此结果略有不同。对于相应的&
运算符,这甚至可能是有害的:例如,如果左侧返回二进制0b01
和右侧二进制0b10
,那么虽然两个参数都不为零,表达式的结果是为零。
在您的情况下,请使用if isnan(x) || isinf(x)
答案 1 :(得分:1)
不同之处在于使用exp1 |时exp2两个表达式都被评估,然后只有|当你使用exp1 ||时执行exp2,exp2仅在exp1为false时进行评估。
答案 2 :(得分:0)
&
和|
运营商不会做您认为他们做的事情。把它们想象成"十字路口"和"联盟"二进制掩码的运算符(即逻辑数组的元素逻辑and
和逻辑or
运算)。
或许最好用一个例子说明:
>> 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
,如果 是真的。它们被称为快捷方式运算符的原因是它们提供了不评估右侧操作数的编程函数,如果左侧的逻辑评估保证表达式&# 39;无论右手边的结果如何。因此,他们的输入需要是逻辑表达式,即评估为逻辑标量值为1或0的东西(即true
或{{1} })。
这对于评估在评估时会导致错误的约束非常有用,例如:除以零或未定义的变量,例如:
false
>> condition1 = exist('MyVar') && MyVar == 0 % no error
condition1 =
0
>> condition2 = exist('MyVar') & MyVar == 0 % error
Undefined function or variable 'MyVar'.
块旨在评估逻辑语句。 ie"如果声明 x 在逻辑上是真的,那么执行 y "。因此,您应该使用快捷操作符,而不是逻辑数组。
if
关键字发生要为数组重载(即if
会起作用)但这只是为了语法方便,对于更严格的编程,你应该真的是明确生成的逻辑表达式应该是什么(例如if [1,1]; disp(1); end
)。
另请注意,虽然if all([1,1]); disp(1); end
已超载,if
不是,但assert
会导致错误,因为assert([1,1])
未评估为{ {1}}(即标量逻辑值为1)。如果您尝试在[1,1]
的上下文中使用true
和&
,那么您可能会搞砸它。