我的数据文件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
正在读取指数低值为零。有办法解决这个问题吗?
答案 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