首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab: assert(array) vs if (array)

Matlab: assert(array) vs if (array)
EN

Stack Overflow用户
提问于 2016-08-19 22:23:06
回答 2查看 346关注 0票数 0

在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会选择这个行为。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-19 22:31:18

如果您在代码中使用assert,则需要绝对确保给定条件为真,部分原因是消除了true定义中的任何歧义。通过要求logical标量,assert强制用户准确地确定他们期望的内容。这也确保了如果MATLAB出于某种原因想要改变将任意数据转换为logical标量的方式,您的assert调用将不会受到影响。

至于为什么if不需要显式的logical标量,我不太确定,但这可能只是为了简化编码,特别是当MATLAB默认使用double数据类型时

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 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])

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39041425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档