在gnuplot中使用stats命令显示对于指数小的值,min和max为零

时间:2018-04-23 08:42:36

标签: plot gnuplot

我的数据文件data.dat如下所示:

1e-23   1e-23   1e-27   2e-28
2e-22   4e-23   1e-23   4e-23
3e-21   1e-23   1e-24   6e-23
4e-32   1e-23   1e-25   8e-30

使用gnuplot,我使用stats "data.dat" matrix查找上述数组(数据文件)中的最小值和最大值;两个值都显示为零。我猜stats正在读取指数低值为零。有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:4)

如果执行命令

stats 'data.dat' matrix

报告的输出最小值/最大值确实是:

  Minimum:            0.0000 [ 0 3 ]
  Maximum:            0.0000 [ 0 2 ]
  COG:                0.1157      1.9057

这是由于Gnuplot用于格式化stats输出中的值的策略。相关功能是:

static char*
fmt( char *buf, double val )
{
    if ( isnan(val) )
  sprintf( buf, "%11s", "undefined");
    else if ( fabs(val) < 1e-14 ) //<-- HERE
  sprintf( buf, "%11.4f", 0.0 );
    else if ( fabs(log10(fabs(val))) < 6 )
  sprintf( buf, "%11.4f", val );
    else
  sprintf( buf, "%11.5e", val );
    return buf;
}

这意味着如果绝对值中的值小于1E-14,它将只显示零...

要获取原始值,您可以使用STATS_min / STATS_max变量:

gnuplot> print STATS_min, STATS_max
4.00000009496891e-32 2.99999990479657e-21

编辑:

stats 'filename' matrix似乎与每列执行的“普通”stats略有不同:

fname = 'data.dat'

stats fname nooutput
N = STATS_columns

#specify which values to include in the minimum calculation    
cond(val) = 1 #(abs(val) > 1E-30)

#process each column individually and determine the global minimum

#if there are no values, set the minimum to +inf
globalMin = real('inf')

do for [i=1:N] {
  stats fname using (cond(column(i))?column(i):NaN) nooutput

  #due to cond( ), there might not be any records, so one needs to check
  if(STATS_records) { 
    globalMin = (STATS_min < globalMin)?STATS_min:globalMin
  }
}
print globalMin