计算超过 100 000 行的文件的每一行的导数

calculation of the derivative for each line of a file with over 100 000 rows

我目前正在处理大文件,其值看起来例如像这样(总是 2 列,但超过 100 000 行):

1.3 1.5

2.5 2.0

3.6 6.0

4.0 10.1

7.8 11.5

对于这些文件,我想计算导数,例如:(2.0-1.5)/(2.5-1.3) & 然后 (6.0-2.0)/(3.6-2.5) 等等。 我写了一个 Scilab 文件,它从文件 (test.txt) 中读取矩阵 x,然后执行一个计算导数的 for 循环。这是我的版本:

[x] = read('test.txt',-1,2);

i = 1;

j = 1;

s = size(x);

for i = 1:s(1,1)-1

f(i) =  (x(i+1,2)-x(i,2))/(x(i+1,1)-x(i,1))

delta(i)=((x(i+1,1)+x(i,1)))/2

i=i+1

end

我的问题有两个:

1) 超过 100 000 行的计算需要很长时间 -> 是否有可能更快地完成计算?或者只有当行数减少时才有可能(例如,只考虑每 1000 步?)

2) 由于我想在 linux 脚本中执行此操作:是否有一种简单的方法可以在 awk 中或使用其他 linux 工具(如 sed...)执行此操作?

非常感谢您的帮助!

斯蒂芬

试试这一行:

awk '{if(NR>1)printf "%.1f\n",(-b)/(-a);a=;b=}' file

使用您的示例数据输出:

0.4
3.6
10.3
0.4

如果结果不是您想要的,请提供一个预期的输出示例。

使用 Scilab,您可以进行如下操作

x = read('test.txt',-1,2);
f=diff(x(:,2))./diff(x(:,1))
delta=(x(2:$,1)+x(1:$-1,1))/2