在Matlab中(截至2016a),条件if (array_of_logicals)在功能上等同于if (all(array_of_logicals))。documentation说:“当一个表达式的结果为非空并且只包含非零元素(逻辑或实数)时,该表达式为真。”
另一方面,assert() only accepts一个“要断言的条件,指定为有效的MATLAB表达式”。从实验上讲,这意味着应该将array_of_logicals用作assert(all(array_of_logicals))。
您认为行为略有不同的原因是什么?
我理解其中一个原因可能是,使用assert()时,您希望排除assert(all(array_of_logicals))与assert(any(array_of_logicals))之间的解释歧义,但对于if也可以这样说。
编辑:特别是,我想了解为什么if会选择这个行为。
发布于 2016-08-19 22:31:18
如果您在代码中使用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发布于 2016-08-19 23:26:18
assert的目的是执行测试,因此将其编码为期望表示测试结果的真/假输入(即“逻辑标量”),而不是任何非零数组是合理的。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...
有趣的是,octave并没有选择以同样的方式实现assert。在倍频程中,此测试将通过:assert([1,1]==[1,1]);
https://stackoverflow.com/questions/39041425
复制相似问题