MATLAB NaN详解

NaN 是 Not a Number 的缩写,意思是“不是一个有效的数字”。

MATLAB NaN 表示一个没有意义的数字,这种数字在数学上是无法定义的。NaN 一般是在没有意义的数学计算中得到的,比如 0/0,Inf/Inf,Inf-Inf,Inf*0。

另外,在处理不完整的数据时,这些数据也会被当做 NaN,比如在读取数字时,遇到的字符不是数字,就会被当做 NaN。

对 NaN 进行运算的结果仍然是 NaN,请看下面的演示代码:
>> a=[1 2 nan inf nan]
a =
    1    2   NaN   Inf   NaN

>> b=2*a
b =
    2    4   NaN   Inf   NaN

>> c=sqrt(a)
c =
    1.0000    1.4142    NaN    Inf    NaN

>> d=(a==nan)
d =
    0   0   0   0   0

>> f=(a~=nan)
f =
    1    1    1    1    1
上面例子中,第一条语句生成了一个含有 NaN 的向量 a,第二和第三条语句分别对 a 进行乘法和开方运算,从运算结果可以看到,对 NaN 进行数学运算的结果仍然是 NaN。

第四条和第五条语句的结果或许有些出乎意料:a==nan 得到的结果全部都是 0(false),而 a~=nan 却得到了全部是 1(true)的结果。这一结果表明,在 MATLAB 中,不同的 NaN 之间是不相等的。

鉴于 NaN 的这种特性,我们在进行关系运算时,就必须确定数组中是否含有 NaN。

isnan() 函数

MATLAB 为我们提供了一个内置函数 isnan(),专门用来寻找数组中是否含有 NaN。下面的代码便是利用 isnan() 函数寻找 a 中的 NaN。
>> g=isnan(a)
g =
    0   0   1   0   1
由结果可知,isnan() 函数在数组中 NaN 的位置返回 1(true)。

另外,将 isnan() 和 find() 函数联合使用可以寻找数组中 NaN 的位置索引。例如,下面的代码为找到数组 a 中 NaN 的位置,然后在这些位置上用 0 替代 NaN。
>> i=find(isnan(a))  $查找NaN的索引位置
i =
     3     5

>> a(i)=zeros(size(i))  %将NaN更改为zeros
a =
    1    2    0    Inf    0