Matlab: assert(array) vs if (array)



在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...

有趣的是,octave并没有选择以同样的方式实现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

相关内容

  • 没有找到相关文章

最新更新