洛伦谈MATLAB的艺术

将想法转化为MATLAB

为什么答案3 < A < 7出乎意料?

网上已经有无数次了(不是真的!)MATLAB新闻组标题中所写的问题已经被问到(并回答)。让我们通过代码来理解发生了什么。

免责声明:我无意在这篇文章中讨论非标量行为。

目录

问题陈述

作为程序的一部分,假设我们需要查看某个值是否位于两个值之间。假设A.我们在极限处检查的值是多少低= 3高= 7.

低= 3;高= 7;

从数学上讲,你可以这样写


           

让我们试试看A.范围内和范围外的值。让我把这个表达式放到一个匿名函数中,这样我就不必重复它了。

myExpr=@(x)低
           
inResult=1 outResult=1

什么? ?

不可能两者都是圆周率173.7.. 发生了什么事?让我们分析一下这个表达式。

表达式第一部分:low < A

让我们看一下表达式的第一部分。

步骤1IN=低
           
step1In = 1 step1Out = 1

我们看到这对我们的两个输入都成立。

表达式的第二部分:以前的输出<高

表达式的第二部分使用第一个表达式的输出并从那里继续。

step2In = step1In < high . (step2Out = step1Out < high .
step2In = 1 step2Out = 1

我们看到这两个都有一个,或者都是真的,发生了什么?

看看这些类型

step1 *
Name Size Bytes Class Attributes step1In 1x1 logical step1Out 1x1 logical . Name Size Bytes Class Attributes

第一步的结果是符合逻辑的——这些数字是否大于? 我们两种价值观的答案都是肯定的,或者符合事实的,在MATLAB中表示为逻辑值。当我们在第二步将这些值作为输入时,所发生的是符合事实的值被解释为值为1的数字输入。然后我们问1是否小于高的.这两种情况都是如此!

如何得到预期答案

我们如何得到期望的答案,这很简单。我们简单地组合两个逻辑表达式,但方式不同于上面。

myExprCorrect=@(x)(低
           
myExprCorrect=@(x)(低
           

我们所做的是首先检查数字是否大于并分别与高的. 在得到两个合乎逻辑的答案后,我们将它们结合起来。对于介于高的因此,结果应该是令人满意的符合事实的只有在这些条件下。

无论如何,我总是使用括号来对表达式进行分组,使它们对我来说非常易读,这样我就不需要在以后考虑我打算测试什么。

复合表达给你带来麻烦了吗?

请让我知道在这里如果你对这篇文章中的表达有困难。




与MATLAB®7.14一起发布

|
  • 打印
  • 发送电子邮件

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。