FAQ > 金融建模 > 建模问题 > 语法相关

Q:空值、INF、NAN的判断及替换方法    

  • A:判断是否为空,采用ifnil;如ifnil(a);若为空,返回1;否则返回0;
      判断是否为NAN,采用isnan;如isnan(a);若为nan,返回1,;否则返回0;
      判断是否为INF,采用IsInfinite;如IsInfinite(a);若为INF或-INF,则返回1;否则返回0;


    如果数组A中存在空值,将其全部替换为0,参考:A::=ifnil(mcell)?0:mcell;
    或使用MFind(A,ifnil(mcell),nil,0);//这种方式最为高效

    如果只想对数组A 的某一列的NAN值替换为0,参考 A[:,1]::=isnan(mcell)?0:mcell; //将数组A的第二列中的NAN值替换为0。
    如果A是一维数组,则可用:A[Mfind(isnan(A))]:=0;
    若是二维数组,则可用:MFind(A,isnan(mcell),nil,0);

    其中,MFind的效率比::高。

    当被判断的数组中包含有不存在的值时,应该用双层for循环对该类元素进行替换,比如下面范例:

    r:=array();
    r[0,'e']:=3;
    r[1,'f']:=23;
    {解析:r数组中,只给指定的两个元素赋值,而其它值比如r[1,'e'],r[0,'f']是不存在的,没有被分配过内存,所以在矩阵循环中,不会对它进行遍历,所以必须用下列这类方法解决。}
    rs:=mrows(r,1);//行下标
    rc:=mcols(r,1);//列下标
    for i:=0 to length(rs)-1 do
      for j:=0 to length(rc)-1 do
       if ifnil(r[rs[i],rc[j]]) then r[rs[i],rc[j]]:='-';
    return r;