罗兰对MATLAB的艺术

将想法转化为MATLAB

请注意

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

什么时候数字结果不是数字?

快速回答:当结果是a时

内容

算术中的nan

MATLAB遵循了IEEE 754:二进制浮点运算标准从早期开始用于计算,并包括在不符合IEEE标准的机器上实现类似结果的工具和功能,例如数字设备公司的VAX计算机。此外,我们在MATLAB中选择允许除以0,而不是在可以处理此行为的机器架构上导致错误(在IEEE标准中允许)。然而,在允许除0的情况下,我们不仅遇到将非零正数和负数除0的情况(得到,但我们也会遇到导致未定义的数学结果的计算,例如

inf-inf
ans = NaN
0/0
警告:除以零。ans = NaN

nan作为占位符

除了允许作为数字运算的结果,我们还鼓励使用它们来标记诸如缺失数据之类的信息。如果我们在某些特定的时间收集一些数据,并且没有收集到其中一个值,我们可能会得到这样的数据:

Ts = 0:5;图(ts,vals,“m * - - - - - -”
vals =列1到列5 0.2000 4.3000 -1.6000 NaN -2.000列6 1.2000

如何找到或比较NaN

根据IEEE标准,不是一个数字,也不等于任何东西,包括它自己。所以在寻找值在数组中,你不能做"显而易见的"

vals == NaN
Ans = 0 0 0 0 0 0 0

正如你所看到的,比较总是。那我们怎么找呢?根据你正在做的事情,你会发现这些函数很有用:

虽然说起来或写起来都很拗口,isequalwithequalnans允许在不允许标量展开的情况下,对匹配值和形状的数组进行比较。

另一种寻找的方法在MATLAB新闻组中经常被引用。看到这个帖子和评论保罗·博丹的作品。这里的意思是,既然

NaN == NaN
Ans = 0

总是产生一个因此,我们可以简单地通过寻找值不等于自身的位置来找到nan。这些是nan,其他值不是。

ourNaNs =vals (vals~=vals)
ournan = NaN
nonnan =vals (vals==vals)
nonnan = 0.2000 4.3000 -1.6000 -2.000 1.2000

我的偏好是使用isnan而是因为我发现以后重新访问它时代码更具可读性。然而,在某些情况下,根据NaN值的数量(可能还有其他考虑因素),上面的构造有时会更快。这里有两个额外的链接,指向讨论更多这方面内容的新闻组线程。

南问题

一些用户发现自己遇到了冲突对于丢失的数据vs。由于未定义的数值运算。

  • 你遇到过这样的碰撞吗?
  • 您是否发现自己希望获得更多占位符值?
  • 你还想用什么或者类似的东西?

让我们听听你的想法。


与MATLAB®7.2发布


评论

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