在Matlab中(截至2016a)条件if (array_of_logicals)
在功能上等同于if (all(array_of_logicals))
。文档中说:"当结果为非空且只包含非零元素(逻辑或实数)时,表达式为真。"
另一方面,assert()
只接受"要断言的条件,指定为有效的MATLAB表达式"。实验上,这意味着array_of_logicals
应该用作assert(all(array_of_logicals))
。
你认为是什么原因导致了这种轻微的不同行为?
我知道一个原因可能是assert()
你想排除assert(all(array_of_logicals))
和assert(any(array_of_logicals))
的解释歧义,但if
也是如此。
编辑:我特别想了解,为什么if
选择了这种行为。
assert
的目的是执行执行测试,因此将其编码为期望true/false输入(即"逻辑标量")表示测试结果是合理的,而不是任何非零数组。if
可以更通用,因为它更有可能接收矩阵比较表达式,而不是执行/验证测试。
if
的行为不是新的,它已经像这样早在我能记得。关于我的2013a: The statements are executed if the real part of the expression has all non-zero elements
。而对于assert
,它只写:evaluate EXPRESSION and, if it is false...
assert
。在octave中,此测试将通过:assert([1,1]==[1,1])
;
如果您在代码中使用assert
,您希望绝对确定给定条件为真,其中一部分是为了消除true定义中的任何歧义。通过要求logical
标量,assert
强制用户确定他们所期望的内容。这也确保了如果由于某种原因MATLAB想要改变它们将任意数据转换为logical
标量的方式,您的assert
调用将不受影响。
至于为什么if
不需要显式的logical
标量,我不确定,但它可能只是为了简化编码,特别是当MATLAB默认使用double
数据类型时
condition = 1
% This will fail since condition is a double not a logical value
assert(condition)
% This won't work if you required explicit logical scalars
if condition
end