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

问题描述 投票:0回答:1

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

My file looks like this:

#! 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

The awk script that I used is:

    #!/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

请帮助我找出问题所在。

谢谢

awk histogram block
1个回答
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)}'
© www.soinside.com 2019 - 2024. All rights reserved.