结合中到标量值的隐式转换if
和while
条件下,Octave的按元素布尔运算符通常足以执行大多数逻辑运算。然而,有时需要停止对布尔表达式进行求值,因为可以确定总体真值。Octave的短路布尔运算符是这样起作用的。
boolean1 && boolean2
¶表达式boolean1使用等效的运算计算并转换为标量all (boolean1(:))
如果boolean1不是逻辑值,如果其值为非零,则视为true,如果其为零,则为false。如果boolean1是一个数组,只有当它不是空的并且所有元素都不是零时,它才为真。如果boolean1如果计算结果为false,则过集合表达式的结果为false。如果为真,表达式boolean2以与相同的方式评估boolean1如果它为真,那么整个表达式的结果就为真。否则,过集合表达式的结果为false。
警告与evaluation等价的一个例外all (boolean1(:))
是何时boolean1
一个空数组。对于MATLAB兼容性,空数组的真值总是false
所以[] && true
计算为false
尽管all ([])
是true
.
boolean1 || boolean2
¶表达式boolean1使用等效的运算计算并转换为标量all (boolean1(:))
如果boolean1不是逻辑值,如果其值为非零,则视为true,如果其为零,则为false。如果boolean1是一个数组,只有当它不是空的并且所有元素都不是零时,它才为真。如果boolean1如果计算结果为true,则过集合表达式的结果为true。如果为false,则表达式boolean2以与相同的方式评估boolean1如果它为真,那么整个表达式的结果就为真。否则,过集合表达式的结果为false。
警告空矩阵的真值总是false
,有关详细信息,详见上一个列表项。
在确定表达式的总体真值之前,可能不会对两个操作数进行求值,这一事实可能很重要。例如,在表达式中
a && b++
变量的值b仅当变量a为非零。
这可以用来编写更简洁的代码。例如,这可能是写
function f (a, b, c) if (nargin > 2 && ischar (c)) ...
而不是必须使用两个if
语句,以避免试图对不存在的参数求值。例如,如果没有短路函数,则需要写入
function f (a, b, c) if (nargin > 2) if (ischar (c)) ...
写
function f (a, b, c) if (nargin > 2 & ischar (c)) ...
将导致错误,如果f
使用一个或两个参数调用,因为Octave将被迫尝试计算运算符的两个操作和&’.
MATLAB具有特殊行为,允许运算符&和|在真理表达式中使用时短路if
和while
语句。Octave的行为与兼容性相同,但是,使用&和|强烈劝阻以这种方式操作,并将报警告。相反,您应该使用&&和||总是有短路行为的运算符。
最后,Octave中不支持三元运算符(?:)。如果短路不重要,可以用ifelse
作用
M =
merge (mask, tval, fval)
¶M =
ifelse (mask, tval, fval)
¶合并的元素true_val和false_val,取决于的值mask.
如果mask是一个逻辑标量,其他两个参数可以是任意值。否则mask必须是逻辑数组,并且tval,fval应该是匹配类的数组或元胞数组。在标量掩模的情况下,tval如果mask为真,否则fval返回。
在数组掩码的情况下,两者tval和fval必须是标量或维度等于的数组mask.结果构造如下:
result(mask) = tval(mask); result(! mask) = fval(! mask);
mask也可以是任意数字类型,在这种情况下,它首先转换为逻辑类型。
编程说明:ifelse
是的别名merge
并且可以互换使用。
版权所有 © 2024-2025 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-2