罗兰谈MATLAB的艺术

将想法转化为MATLAB

请注意

罗兰谈MATLAB的艺术已存档,不会更新。

逻辑故事

让我为今天的博客做个铺垫。逻辑变量从早期开始就是MATLAB的一部分。它们在涉及控制流的构造中特别有用,例如如果而且语句。但是MATLAB作为一种面向数组的语言,需要处理下面的表达式如果而且它可以是任何大小,包括空矩阵。但有时,当两个看似相同的语句表现不同时,用户会感到困惑。理解在于标量展开、空数组和逻辑运算符的交集短路而且elementwise

内容

逻辑运算符、标量展开和空数组

最近在MATLAB新闻组,一名用户想知道为什么两个看起来一样的语句却没有给出相同的答案。让我们来看看。

如果4 | [] disp(“一定是真的”结束
一定是真的

MATLAB计算

4 | []

作为真正的

但是,将参数的顺序交换为|结果为

如果[] | 4 disp(“一定是真的”其他的disp (“一定是假的”结束
一定是假的

这怎么可能呢?

帮助解开谜团的信息

有几个概念可能有助于理解这个谜团。

  • 空数组求值为为了如果而且
  • 的nonscalar|而且操作人员短路如果而且表达,而不是其他。
  • 最好是喂食如果而且标量表达式。这意味着要考虑使用更新的(MATLAB 6.5版)逻辑运算符||,& &.这些操作符总是短路。
  • 显式使用约简操作将表达式约简为标量。这些操作的示例包括所有而且任何

回到示例

那么,这段代码发生了什么?

如果4 | [] disp(“一定是真的”结束4是非零且明确为真,所以这就是你看到的结果。。
一定是真的

语句的反求需要对[]首先,对4进行标量展开,得到[]那就是

如果[] | 4 disp(“一定是真的”其他的disp (“一定是假的”结束
一定是假的

但是,如果您试图调试这个问题,您可能会尝试求值

DBG = 4 | []
DBG = []

你会发现dbg是空的(因为标量展开),因此,会是根据上面的大部分规则。但是,它并没有说明短路的性质|而且如果而且

注意事项和建议

如果你可能有空的,你想检查,检查isempty

使用||而且& &的表达式中的运算符如果而且.这些表达式表现一致,这意味着它们总是短路,因此更容易调试。它们还迫使您将表达式缩减为标量,从而更容易看到一个简单的表达式真正的在控制流上下文中的意思。你还有其他的指导方针吗?分享它们在这里




使用MATLAB®7.3发布


评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。

Baidu
map