为什么我因为加权潜力而变得“inf”

时间:2016-02-25 05:04:21

标签: awk histogram block

我正在使用awk脚本从我的数据创建直方图:

我的文件如下:

#! FIELDS time p1.sss p1.zzz bias
0.000000 1.717539 0.694226 0.600000
0.020000 1.716644 0.696346 0.0000300
0.040000 1.715884 0.691981 3.861161
0.060000 1.715452 0.703569 0.000000
0.080000 1.715754 0.697158 0.020000
0.100000 1.716890 0.690405 2.050000
0.120000 1.718104 0.700375 0.070000
0.140000 1.719044 0.710520 5.000000
0.160000 1.719809 0.712205 0.000000
0.180000 1.720627 0.729156 0.090000

我使用的awk脚本是:

    #!/bin/bash
    grep -v \# datas | tail -n 100 |
    awk 'BEGIN{
    min1=-3.14159265358979
    max1=+3.14159265358979
    min2=-3.14159265358979
    max2=+3.14159265358979
    nb1=4;
    nb2=4;
    for(i1=0;i1<nb1;i1++) for(i2=0;i2<nb2;i2++) f[i1,i2]=0.0;
    }{
    i1=int(($2-min1)*nb1/(max1-min1));
    i2=int(($3-min2)*nb2/(max2-min2));
    # we assume the potential is in the last column, and kbT=2.5 kj/mol
    w=exp($4/2.5);
    f[i1,i2]+=w;
    }END{
    for(i1=0;i1<nb1;i1++){
    for(i2=0;i2<nb2;i2++) print min1+i1/100.0*(max1-min1), min2+i2/100.0*(max2-min2), -2.5*log(f[i1,i2]);
    print "";
    }}' > plotme

当我运行这个awk脚本时,值是按预期的块,但我得到了第3列几乎所有函数的“inf”输出:

-3.14159 -3.14159 inf
-3.14159 -3.07876 inf
-3.14159 -3.01593 inf
-3.14159 -2.9531 inf

-3.07876 -3.14159 inf
-3.07876 -3.07876 inf
-3.07876 -3.01593 inf
-3.07876 -2.9531 inf

-3.01593 -3.14159 inf
-3.01593 -3.07876 inf
-3.01593 -3.01593 inf
-3.01593 -2.9531 inf

-2.9531 -3.14159 inf
-2.9531 -3.07876 inf
-2.9531 -3.01593 -7.69205
-2.9531 -2.9531 inf

请帮助我找出问题所在。

由于

1 个答案:

答案 0 :(得分:0)

值的范围不是0到4.对于双重迭代,大多数f值最终为空。这里根据您的数据快速重写您的函数,只计算一些索引值。

$ cat test.awk

    BEGIN {
            PI = 2*atan2(1,0)
            min1 = min2 = -PI
            max1 = max2 = PI
            nb1 = nb2 = 4
    }

    {
            i1 = int(($2 - min1) * nb1 / (max1 - min1))
            i2 = int(($3 - min2) * nb2 / (max2 - min2))
            w = exp($4 / 2.5)
            f[i1","i2] += w
    }

    END {
           for (k in f) {
               split(k,i,",");
               print k":" min1 + i[1]/100*(max1 - min1),
                          min2 + i[2]/100*(max2 - min2), 
                          -2.5 * log(f[k])
           }
    }

关键点在您的结束块中,您必须确保仅在f数组中迭代索引。

跑步给出了这个

$ awk -f test.awk data

2,2:-3.01593 -3.01593 0
3,2:-2.9531 -3.01593 -7.69205

因此,只计算2,2和3,2个指数。

使用零初始化f数组,对于大多数索引,值保持为零。 试试这个,也许会帮助你理解你获得Inf的原因。

$ awk 'BEGIN{print log(0)}'