Gnuplot 如何平均多个具有不同x和y值的表文件

Gnuplot 如何平均多个具有不同x和y值的表文件,gnuplot,octave,Gnuplot,Octave,我得到了一些包含相同测量结果的表格文件,但由于差异不大,数据点得到了不同的x和y值。但我需要所有六个文件的平均值。以下是两个(缩短的)示例文件: # file1.dat 9.840000000000000E+00 1.680000000000000E+02 9.840071206052514E+00 1.730000000000000E+02 9.840142412105029E+00 1.630000000000000E+02 9.840213618157543E+00

我得到了一些包含相同测量结果的表格文件,但由于差异不大,数据点得到了不同的x和y值。但我需要所有六个文件的平均值。以下是两个(缩短的)示例文件:

# file1.dat
  9.840000000000000E+00  1.680000000000000E+02
  9.840071206052514E+00  1.730000000000000E+02
  9.840142412105029E+00  1.630000000000000E+02
  9.840213618157543E+00  1.730000000000000E+02
  9.840284824210057E+00  1.690000000000000E+02
  9.840356030262573E+00  1.720000000000000E+02
  9.840427236315087E+00  1.660000000000000E+02
  9.840498442367601E+00  1.750000000000000E+02
  9.840569648420116E+00  1.650000000000000E+02
  9.840640854472630E+00  1.720000000000000E+02

[还有四个类似的文件…]

如果我用
gnuplot
将它们全部绘制出来,但每个表都作为自己的曲线,我得到了这个

但我需要一条曲线,显示所有六张表的平均值

我尝试了
join
,但结果是一个空文件,我想它不会起作用,因为第一列(x值)在每个文件中不包含相同的值。尝试在
gnuplot
中使用
plot data1u 1:2+data2u 1:2
进行求和也失败

我找到了,但只合并文件没有帮助


我使用的是Mac OS X,但可以访问Ubuntu,所以如果有任何工具可以做到这一点


剧本的新组合

> AVDEBUG=1 octave -qf avfiles.m messung3.dat messung4.dat
warning: ================
warning: processing file: messung3.dat
warning: size of the matrix in the file: 2248      3
warning: min(x): 0.000000e+00
warning: max(x): 0.000000e+00
warning: min(y): 9.840000e+00
warning: max(y): 1.000000e+01
warning: ================
warning: processing file: messung4.dat
warning: size of the matrix in the file: 2254      3
warning: min(x): 0.000000e+00
warning: max(x): 0.000000e+00
warning: min(y): 9.840000e+00
warning: max(y): 1.000000e+01
warning: yp is undefined at 2248 points
如果您愿意,可以从下载我的数据文件。数据应该由所有文件组成。

这很容易理解。创建文件
avfiles.m
。用法:

octave -qf avfiles.m file1.dat file2.dat
octave-q--eval“test avfiles”
使用测试数据创建文件
aux_文件[0-9]

avfiles.m:

#!/usr/bin/octave -qf
# Average y values in several files
# Usage:
# octave -qf avfiles.m aux_file0 aux_file1 aux_ file2

if isempty(getenv("AVDEBUG"))
  warning ("off", "avfiles")
endif

setenv("LC_NUMERIC", "C"); 

arg_list = argv ();
for k = 1:nargin
  fname = arg_list{k};
    warning ("avfiles", "================");
    warning ("avfiles", "processing file: %s", fname);
    data = dlmread(fname);
    warning ("avfiles", "size of the matrix in the file: %s", num2str(size(data)));
    x = data(:, 1);
    y = data(:, 2);
    warning ("avfiles", "min(x): %e", min(x));
    warning ("avfiles", "max(x): %e", max(x));
    warning ("avfiles", "min(y): %e", min(y));
    warning ("avfiles", "max(y): %e", max(y));
    [x, idx] = sort(x);
    y = y(idx);
    if k==1
      % use x values from the first file
      xp = x; yp = y;
    else
      yp = 1/k * ( (k-1)*yp + interp1(x, y, xp) );
      warning ("avfiles", "yp is undefined at %d points", sum(isnan(yp)));
    endif
endfor

idx = !isnan(yp);
dlmwrite("/dev/stdout", [xp(idx), yp(idx)], ' ');

%!test
%! n = 100;
%! for k=0:9
%!   x = unifrnd(0, 2*pi, n, 1);
%!   y = sin(x) + 0.05*stdnormal_rnd(n, 1);
%!   dlmwrite(sprintf("aux_file%i", k), [x y], " ");
%! end
%! system("octave -qf avfiles.m aux_file[0-9] > aux_out");
%! data = dlmread("aux_out");
%! x = data(:, 1); y = data(:, 2);
%! assert(sin(x), y, 0.08);
运行
AVDEBUG=1倍频程-qf avfiles.m file1.dat file2.dat
以获取跟踪。通过您的示例文件,我得到:

warning: ================
warning: processing file: file1.dat
warning: size of the matrix in the file: 10    2
warning: min(x): 9.840000e+00
warning: max(x): 9.840639e+00
warning: min(y): 1.530000e+02
warning: max(y): 1.790000e+02
warning: ================
warning: processing file: file2.dat
warning: size of the matrix in the file: 10    2
warning: min(x): 9.840000e+00
warning: max(x): 9.840641e+00
warning: min(y): 1.630000e+02
warning: max(y): 1.750000e+02
warning: yp is undefined at 0 points

谢谢你的回答。我会尽快尝试安装
octave
:-)嗯…我安装了
octave
,但是当我调用脚本时,我收到消息
错误:对dlmwrite的调用无效。正确的用法是:
@Tobi如果您尝试
octave-q--eval“test avfiles”
,会发生什么?您有哪个版本的八度音阶(
octave-v
)?我已经用3.6.2和3.6.0进行了测试。@Tobi试图将
dlmwrite(stdout(),[xp(idx),yp(idx)],“
更改为
dlmwrite(stdout,[xp(idx),yp(idx)],”)
不幸的是,即使我更改了行,它也不起作用。我在上面的原始问题中添加了完整的错误代码…
warning: ================
warning: processing file: file1.dat
warning: size of the matrix in the file: 10    2
warning: min(x): 9.840000e+00
warning: max(x): 9.840639e+00
warning: min(y): 1.530000e+02
warning: max(y): 1.790000e+02
warning: ================
warning: processing file: file2.dat
warning: size of the matrix in the file: 10    2
warning: min(x): 9.840000e+00
warning: max(x): 9.840641e+00
warning: min(y): 1.630000e+02
warning: max(y): 1.750000e+02
warning: yp is undefined at 0 points