Awk 为什么我';“我得到了”;inf";我的加权势

Awk 为什么我';“我得到了”;inf";我的加权势,awk,histogram,block,Awk,Histogram,Block,我正在使用awk脚本根据我的数据创建直方图: 我的文件如下所示: 我使用的awk脚本是: 请帮我找出问题所在 感谢您将值的范围设置为非0到4。对于您的双重迭代,大多数f值最终为空。下面是基于数据对函数的快速重写,只计算了几个索引值 $cat test.awk BEGIN { PI = 2*atan2(1,0) min1 = min2 = -PI max1 = max2 = PI nb1 = n

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

我的文件如下所示: 我使用的awk脚本是: 请帮我找出问题所在


感谢您将值的范围设置为非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)}'

来吧,至少缩进你的代码。显示一点努力。
inf
s显然来自表达式
-2.5*log(f[i1,i2])
,因此很明显,矩阵的某些值为0,因此很可能矩阵中的某些条目没有按照您明显期望的方式更新。您是否尝试添加“print”语句以协助调试?这里有一个需要考虑的问题:
print“f[“i1”,“i2”]=“f[i1,i2]谢谢你的回复,莫顿。当我尝试打印“f[“i1”,“i2”]=“f[i1,i2];”,我的函数没有结果,输出看起来像f[2,4]=;这清楚地表明f[i1,i2]根本没有更新。您假设
i1
i2
介于0和4之间,但无法保证会出现什么问题,因为您使用数据进行更新我对i1和i2的值没有问题,但我的问题是函数f[i1,i2]将给定的值保持为零,就像在命令行
中为(i1=0;i1
    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])
           }
    }
$ awk -f test.awk data

2,2:-3.01593 -3.01593 0
3,2:-2.9531 -3.01593 -7.69205
$ awk 'BEGIN{print log(0)}'