我正在使用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
#!/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
请帮助我找出问题所在。
由于
答案 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)}'