逻辑故事
让我为今天的博客做个铺垫。逻辑变量从早期开始就是MATLAB的一部分。它们在涉及控制流的构造中特别有用,例如如果而且而语句。但是MATLAB作为一种面向数组的语言,需要处理下面的表达式如果而且而它可以是任何大小,包括空矩阵。但有时,当两个看似相同的语句表现不同时,用户会感到困惑。理解在于标量展开、空数组和逻辑运算符的交集短路而且elementwise.
内容
逻辑运算符、标量展开和空数组
最近在MATLAB新闻组,一名用户想知道为什么两个看起来一样的语句却没有给出相同的答案。让我们来看看。
如果4 | [] disp(“一定是真的”)结束
一定是真的
MATLAB计算
4 | []
作为真正的.
但是,将参数的顺序交换为|结果为假.
如果[] | 4 disp(“一定是真的”)其他的disp (“一定是假的”)结束
一定是假的
这怎么可能呢?
帮助解开谜团的信息
有几个概念可能有助于理解这个谜团。
回到示例
那么,这段代码发生了什么?
如果4 | [] disp(“一定是真的”)结束4是非零且明确为真,所以这就是你看到的结果。。
一定是真的
语句的反求需要对[]首先,对4进行标量展开,得到[]那就是假.
如果[] | 4 disp(“一定是真的”)其他的disp (“一定是假的”)结束
一定是假的
但是,如果您试图调试这个问题,您可能会尝试求值
DBG = 4 | []
DBG = []
你会发现dbg是空的(因为标量展开),因此,会是假根据上面的大部分规则。但是,它并没有说明短路的性质|而且&在如果而且而.
注意事项和建议
如果你可能有空的,你想检查,检查isempty.
使用||而且& &的表达式中的运算符如果而且而.这些表达式表现一致,这意味着它们总是短路,因此更容易调试。它们还迫使您将表达式缩减为标量,从而更容易看到一个简单的表达式真正的或假在控制流上下文中的意思。你还有其他的指导方针吗?分享它们在这里.
评论
如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。