math
- 官方文档:
- 简介:
表数据的逆波兰表示法(RPN)计算
math 使用逆波兰表示法(Reverse Polish Notation)对一个或多个表数据文件或者
常量进行加减乘除等操作。逆波兰表示法是一种后缀表示法,即将运算符写在操作数之后。
该模块可以计算任意复杂的运算。模块默认逐元素进行计算操作。其中某些运算符仅
需要一个参数。如果输入中不含表文件,则可以使用 -T 或 -N 选项。默认
情况下,除了时间以外的列,所有的列都参与运算(见 -C )。如果多个运算整体
非常复杂或者频繁出现,可以编写为宏以便后续使用。
语法
gmt math
[ -At_f(t)[+e][+r][+s|w] ]
[ -Ccols ]
[ -Eeigen ]
[ -I ]
[ -Nn_col[/t_col] ]
[ -Q[c|i|p|n] ]
[ -S[f|l] ]
[ -T[min/max/inc[+b|i|l|n]|file|list] ]
[ -V[level] ]
[ -bibinary ]
[ -bobinary ]
[ -dnodata[+ccol] ]
[ -eregexp ]
[ -fflags ]
[ -ggaps ]
[ -hheaders ]
[ -iflags ]
[ -oflags ]
[ -qflags ]
[ -sflags ]
[ -wflags ]
[ --PAR=value ]
operand [ operand ] OPERATOR [ operand ] OPERATOR …
= [ outfile ]
输入输出数据
- operand
如果 operand 是一个文件,GMT 将试着以表文件的形式读取该文件。如果非文件, 将被解析为 其他符号 。 若为 STDIN ,表示将读取标准输入并放入堆栈中。 如果有必要, STDIN 参数可以多次出现。
- = outfile
输出表数据文件名,不指定的情况下写到标准输出
可选选项
- -A
- -At_f(t)[+e][+r][+s|w]
建立并求解线性方程。 该选项需要
-Nn_col[/t_col] 选项,用来从给定的 t_f(t) 文件中 进行初始化解方程所需的增广矩阵,其中 t_f(t) 文件只包含 t 和 f(t) 两列。 在增广矩阵中,t 变量于 编号为 t_col 指定的列, f(t) 位于编号为 n_col - 1 的列。+e 使用 LSQFIT 或 SVDFIT 操作符时,使用该选项,可以求解拟合系数 。结果包括 4 列:t,f(t),t 位置的计算值,t 位置的残差 [默认只输出系数]
+r 选项只输出 f(t)
+s 指定 t_f(t) 的第三列为 1 倍中误差
+w 指定 t_f(t) 的第三列为权重
具体使用方法见倒数第二个示例。
- -C
- -Ccols
选择要运算的列 cols 。多列以逗号分隔,类似 1,3-5,7 的表达形式也是允许 的;此外,-Cx 等效于 -C0,-Cy 等效于 -C1。使用不带任何参数的
-C选项 可用来重置,即选择除时间列外的所有列(见-N)。-Ca 选择所有的列, 包括时间列, -Cr 的作用是反向选择,即选择除当前已选定的列以外的其他 列。
- -E
- -Eeigen
设置 LSQFIT 和 SVDFIT 运算符的特征值,默认为 1e-7。比 1e-7 更小的 特征值将被重置为 0 ,并在求解中不考虑。
- -I
- -I
将输出数据从升序变为降序 [默认为升序]
- -N
- -Nn_col[/t_col]
设置列数和时间所在的列,列从 0 开始计数,默认输入列最大编号 n_clo 为 2 , 时间列 t_col 位于第 0 列。
- -Q
- -Q[c|i|p|n]
实现不同长度单位之间的快速计算, -Ca
-N1/0-T0/0/1 的简写。 在进行不同单位的长度计算时,在计算前都转换为 inch ,然后计算,并将结果 转换为 PROJ_LENGTH_UNIT 设置的单位。使用 c , i , p 可设置对应的输出长度单位。 n 表示输出结果无量纲。
- -S
- -S[f|l]
仅输出结果的第一行 [默认为所有行]。这在输出统计结果的时候可能会 有用(比如 MODE 运算)。 l 和 f 分别表示第一行和最后一行。
- -T
- -T[min/max/inc[+b|i|l|n]|file|list]
不加任何选项和文件,表明没有输入文件。其他详见 生成一维数组
- -V
- -V[level]
设置 verbose 等级 [w]。 (参数详细介绍)
- -bi
- -bi[ncols][type][w][+l|b]
控制二进制文件的输入格式。 (参数详细介绍)
- -bo
- -bo[ncols][type][w][+l|b]
控制二进制文件的输出格式。 (参数详细介绍)
- -d
- -d[i|o]nodata
将某些特定值当作 NaN。 (参数详细介绍)
- -e
- -e[~]“pattern” | -e[~]/regexp/[i]
筛选或剔除匹配指定模式的数据记录。 (参数详细介绍)
- -f
- -f[i|o]colinfo
显式指定当前输入或输出数据中每一列的数据类型。 (参数详细介绍)
- -g
- -g[a]x|y|d|X|Y|D|[col]zgap[+n|p]
确定数据或线段的间断。 (参数详细介绍)
- -h
- -h[i|o][n][+c][+d][+msegheader][+rremark][+ttitle]
在读/写数据时跳过文件开头的若干个记录。 (参数详细介绍)
- -i
- -icols[+l][+sscale][+ooffset][,…][,t[word]]
对输入的数据进行列选择以及简单的代数运算。 (参数详细介绍)
- -o
- -ocols[,…][,t[word]]
对输出的数据进行列选择以及简单的代数运算。 (参数详细介绍)
- -q
- -q[i|o][~]rows[+ccol][+a|f|s]
对输入或输出的行进行筛选,该选项在一定程度上可以代替 gawk 的某些功能。 (参数详细介绍)
- -s
- -s[cols][+a|+r]
设置 NaN 记录的处理方式。 (参数详细介绍)
- -w
- -wy|a|w|d|h|m|s|cperiod[/phase][+ccol]
将输入坐标转换为循环坐标。 (参数详细介绍)
- -^ 或 -
显示简短的帮助信息,包括模块简介和基本语法信息(Windows下只能使用 -)
- -+ 或 +
显示帮助信息,包括模块简介、基本语法以及模块特有选项的说明
- -? 或无参数
显示完整的帮助信息,包括模块简介、基本语法以及所有选项的说明
- --PAR=value
临时修改GMT参数的值,可重复多次使用。参数列表见 配置参数
生成一维数组
下面将展示如何使用 math 生成一维数组(其中大部分操作也可通过 linux 中的 seq 命令方便地实现)
不使用任何子选项
以 0.1 为步长,生成 3.1 到 4.2 等等间隔序列
gmt math -o0 -T3.1/4.2/0.1 T =
3.1
3.2
...
4.2
+a 选项
该选项不对生成的数列进行运算操作,而是将该数列以列的形式追加到输出表数据,类似 linux 中的 paste 命令。
+b 选项
以 3 和 20 分别为起点和终点,创建一个 2 的整数幂的列表,将生成 的整数幂以 1 为步长取值 -T3/20/1+b
gmt math -o0 -T3/20/1+b T =
4
8
16
+l 选项
以 7 和 135 分别为起点和终点,先创建一个 10 的整数幂的列表,当 inc 为 1 时,输出该列表;当 inc 为 2 时,同时输出该列表中每个元素的 1,2,5 倍值(不包括超出原始数据范围的部分); 当 inc 为 3 时,同时输出 该列表中每个元素的 1,2,…,9 倍值(同样不包括超出原始数据范围的部分)。 -T7/135/2+l 将会生成如下数列
gmt math -o0 -T7/135/2+l T =
10
20
50
100
inc 为负整数时,将实现如下效果
gmt math -o0 -T1e-4/1e4/-2+l T =
0.0001
0.01
1
100
10000
+i 选项
该选项将以 1 作为默认步长,第三个数字做为每步长中的数字个数 length。假设需要在 1 分钟内每 24 秒生成一帧
gmt math -o0 -T0/60/24+i T =
0
0.0416666666667
0.0833333333333
0.125
0.166666666667
...
60
+n 选项
生成固定长度的数列。以 3.44 和 7.82 为 起点和终点,生成长度为 5 的等间隔序列
gmt math -o0 -T3.44/7.82/5+n T =
3.44
4.535
5.63
6.725
7.82
-T 后直接加文件或逗号分隔的数列
-T 后可以直接加文件,文件中即为要生成的列表;另外,可以直接使用逗号分隔, 将列表附加到 -T 选项后,如下为 Fibonacci 数列前 6 项
gmt math -o0 -T0,1,1,2,3,5 T =
0
1
1
2
3
5
注 : 如果数列只包含一个值,必须在其后加逗号以表明仍是一个数列
+u 选项
如果文件或者逗号分隔的数列中有重复数字或未排序,可以使用 +u 选项去重并排序。
+t 选项
生成绝对时间序列。在 inc 后分别添加 y ,o ,d ,h , m 和 s 表示时间步长的单位为年,月,日,时,分,秒。在其后附加 +t 选项, 可以进一步强调生成时间序列,也可以不加
gmt math -o0 -T2020-03-01T/2020-03-07T/1d T =
2020-03-01T00:00:00
2020-03-02T00:00:00
2020-03-03T00:00:00
2020-03-04T00:00:00
2020-03-05T00:00:00
2020-03-06T00:00:00
2020-03-07T00:00:00
生成距离序列
如果输入文件中包含两列以上的数据,可以使用前两列计算距离,并生成等距序列。 在 inc 后分别添加 d,m,s,e,f,M,n 和 u 表示距离步长的单位为度,分,秒,米,英尺,公里,英里,海里,英尺。如果 为笛卡尔坐标,使用 c 作为距离步长单位。
+e 选项
如果只给定 inc 而从数据中获取最大值和最小值,则 (max - min)/inc 可能 不是整数,GMT 讲会自动对 inc 进行一定的调整。如果不想调整 inc ,则可以 使用 +e 选项,GMT 会固定最小值,适当调整最大值。
运算符
Operator 为运算符名称; args 分别表示输入参数和输出参数个数;
Returns 中的 A B C … 等字符表示输入参数。
所有的三角函数运算符默认输入为弧度,若运算符最后一个字母为 D 表示使用角度计算。
运算符 (Operator) |
参数 (args) |
返回值 (Returns) |
函数类型 (Type) |
|---|---|---|---|
|
1 1 |
A 的绝对值 |
算术运算 |
|
1 1 |
反余弦(结果为弧度) |
微积分/三角函数 |
|
1 1 |
反余弦(结果为度) |
微积分/三角函数 |
|
1 1 |
反双曲余弦 |
微积分/三角函数 |
|
1 1 |
反余切(结果为弧度) |
微积分/三角函数 |
|
1 1 |
反余切(结果为度) |
微积分/三角函数 |
|
1 1 |
反余割(结果为弧度) |
微积分/三角函数 |
|
1 1 |
反余割(结果为度) |
微积分/三角函数 |
|
2 1 |
A + B(加法) |
算术运算 |
|
2 1 |
如果 A 等于 NaN 则返回 B,否则返回 A |
逻辑运算 |
|
1 1 |
反正割(结果为弧度) |
微积分/三角函数 |
|
1 1 |
反正割(结果为度) |
微积分/三角函数 |
|
1 1 |
反正弦(结果为弧度) |
微积分/三角函数 |
|
1 1 |
反正弦(结果为度) |
微积分/三角函数 |
|
1 1 |
反双曲正弦 |
微积分/三角函数 |
|
1 1 |
反正切(结果为弧度) |
微积分/三角函数 |
|
2 1 |
A/B 的反正切(结果为弧度) |
微积分/三角函数 |
|
2 1 |
A/B 的反正切(结果为度) |
微积分/三角函数 |
|
1 1 |
反正切(结果为度) |
微积分/三角函数 |
|
1 1 |
反双曲正切 |
微积分/三角函数 |
|
3 1 |
二项分布累积分布函数 (p = A, n = B, x = C) |
概率统计 |
|
1 1 |
开尔文函数 bei (A) |
特殊函数 |
|
1 1 |
开尔文函数 ber (A) |
特殊函数 |
|
2 1 |
A & B (按位与运算) |
逻辑运算 |
|
2 1 |
A << B (按位左移运算) |
算术运算 |
|
1 1 |
~A (按位非运算,即返回补码) |
逻辑运算 |
|
2 1 |
A | B (按位或运算) |
逻辑运算 |
|
2 1 |
A >> B (按位右移运算) |
算术运算 |
|
2 1 |
如果 A 的第 B 位被设置则返回 1,否则为 0 (按位测试) |
逻辑运算 |
|
2 1 |
A ^ B (按位异或运算) |
逻辑运算 |
|
3 1 |
二项分布概率密度函数 (p = A, n = B, x = C) |
概率统计 |
|
1 1 |
ceil (A) (大于或等于 A 的最小整数) |
逻辑运算 |
|
2 1 |
卡方累积分布函数 (chi2 = A, nu = B) |
概率统计 |
|
2 1 |
卡方分布临界值 (alpha = A, nu = B) |
概率统计 |
|
2 1 |
卡方概率密度函数 (chi2 = A, nu = B) |
概率统计 |
|
1 1 |
将 A 列压入栈中 |
特殊操作符 |
|
2 1 |
组合数 nCr (n = A, r = B) |
概率统计 |
|
2 1 |
相关系数 r(A, B) |
概率统计 |
|
1 1 |
A 的余弦(A 为弧度) |
微积分/三角函数 |
|
1 1 |
A 的余弦(A 为度) |
微积分/三角函数 |
|
1 1 |
A 的双曲余弦 |
微积分/三角函数 |
|
1 1 |
A 的余切(A 为弧度) |
微积分/三角函数 |
|
1 1 |
A 的余切(A 为度) |
微积分/三角函数 |
|
1 1 |
A 的余割(A 为弧度) |
微积分/三角函数 |
|
1 1 |
A 的余割(A 为度) |
微积分/三角函数 |
|
1 1 |
d2(A)/dt2 中央二阶导数 |
微积分/三角函数 |
|
1 1 |
度转换为弧度 |
特殊操作符 |
|
1 1 |
d(A)/dt 中央一阶导数 |
微积分/三角函数 |
|
1 1 |
球面度转换为公里 |
特殊操作符 |
|
2 1 |
用 B 中的值替换 A 中的 NaN |
逻辑运算 |
|
1 1 |
A 相邻元素间的前向差分 (A[1]-A[0], A[2]-A[1], …, NaN) |
算术运算 |
|
1 1 |
双对数 (Spence’s) 函数 |
特殊函数 |
|
2 1 |
A / B (除法) |
算术运算 |
|
1 2 |
在栈中复制一份 A |
特殊操作符 |
|
2 1 |
指数累积分布函数 (x = A, lambda = B) |
概率统计 |
|
2 1 |
指数分布临界值 (alpha = A, lambda = B) |
概率统计 |
|
2 1 |
指数概率密度函数 (x = A, lambda = B) |
概率统计 |
|
2 1 |
如果 A 等于 B 则返回 1,否则为 0 |
逻辑运算 |
|
1 1 |
误差函数 erf (A) |
概率统计 |
|
1 1 |
互补误差函数 erfc (A) |
概率统计 |
|
1 1 |
A 的反误差函数 |
概率统计 |
|
2 2 |
交换栈中的 A 和 B |
特殊操作符 |
|
1 1 |
e 的次幂 |
算术运算 |
|
1 1 |
A! (A 的阶乘) |
算术运算 |
|
3 1 |
F 累积分布函数 (F = A, nu1 = B, nu2 = C) |
概率统计 |
|
3 1 |
F 分布临界值 (alpha = A, nu1 = B, nu2 = C) |
概率统计 |
|
1 1 |
反转每一列的顺序 |
特殊操作符 |
|
1 1 |
小于或等于 A 的最大整数 |
逻辑运算 |
|
2 1 |
A % B (截断除法的余数) |
算术运算 |
|
3 1 |
F 概率密度函数 (F = A, nu1 = B, nu2 = C) |
概率统计 |
|
2 1 |
如果 A >= B 则返回 1,否则为 0 |
逻辑运算 |
|
2 1 |
如果 A > B 则返回 1,否则为 0 |
逻辑运算 |
|
3 3 |
将 h,s,v 三元组转换为 l,a,b 三元组 (h=A[0-360], s=B, v=C[0-1]) |
特殊操作符 |
|
3 3 |
将 h,s,v 三元组转换为 r,g,b 三元组 (h=A[0-360], s=B, v=C[0-1]) |
特殊操作符 |
|
3 3 |
将 h,s,v 三元组转换为 x,t,z 三元组 (h=A[0-360], s=B, v=C[0-1]) |
特殊操作符 |
|
2 1 |
直角三角形的斜边长度 (= sqrt (A2 + B2)) |
微积分/数学运算 |
|
1 1 |
A 的修正贝塞尔函数 (第一类, 0阶) |
特殊函数 |
|
1 1 |
A 的修正贝塞尔函数 (第一类, 1阶) |
特殊函数 |
|
3 1 |
如果 A 不等于 0 则返回 B,否则返回 C |
逻辑运算 |
|
2 1 |
A 的修正贝塞尔函数 (第一类, B阶) |
特殊函数 |
|
3 1 |
如果 B <= A <= C 则返回 1,否则为 0 |
逻辑运算 |
|
1 1 |
对 A 进行数值积分 |
微积分/数学运算 |
|
1 1 |
取倒数 (1/A) |
算术运算 |
|
1 1 |
如果 A 是有限值则返回 1,否则为 0 |
逻辑运算 |
|
1 1 |
如果 A 等于 NaN 则返回 1,否则为 0 |
逻辑运算 |
|
1 1 |
A 的贝塞尔函数 (第一类, 0阶) |
特殊函数 |
|
1 1 |
A 的贝塞尔函数 (第一类, 1阶) |
特殊函数 |
|
2 1 |
A 的贝塞尔函数 (第一类, B阶) |
特殊函数 |
|
1 1 |
A 的修正开尔文函数 (第二类, 0阶) |
特殊函数 |
|
1 1 |
A 的修正贝塞尔函数 (第二类, 1阶) |
特殊函数 |
|
1 1 |
开尔文函数 kei (A) |
特殊函数 |
|
1 1 |
开尔文函数 ker (A) |
特殊函数 |
|
1 1 |
公里转换为球面度 |
特殊操作符 |
|
2 1 |
A 的修正贝塞尔函数 (第二类, B阶) |
特殊函数 |
|
1 1 |
A 的峰度 (Kurtosis) |
概率统计 |
|
3 3 |
将 l,a,b 三元组转换为 h,s,v 三元组 |
特殊操作符 |
|
3 3 |
将 l,a,b 三元组转换为 r,g,b 三元组 |
特殊操作符 |
|
3 3 |
将 l,a,b 三元组转换为 x,y,z 三元组 |
特殊操作符 |
|
1 1 |
拉普拉斯累积分布函数 (z = A) |
概率统计 |
|
1 1 |
拉普拉斯分布临界值 (alpha = A) |
概率统计 |
|
2 1 |
如果 A <= B 则返回 1,否则为 0 |
逻辑运算 |
|
1 1 |
A 的 LMS (最小中位数平方) 尺度估计 (LMS STD) |
概率统计 |
|
2 1 |
A 基于权重 B 的加权 LMS 尺度估计 (LMS STD) |
概率统计 |
|
1 1 |
log (A) (自然对数) |
算术运算 |
|
1 1 |
log10 (A) (以 10 为底的对数) |
算术运算 |
|
1 1 |
log (1+A) (自然对数,对极小值 A 更精确) |
算术运算 |
|
1 1 |
log2 (A) (以 2 为底的对数) |
算术运算 |
|
1 1 |
A 的最低值 (最小值) |
算术运算 |
|
1 1 |
拉普拉斯概率密度函数 (z = A) |
概率统计 |
|
2 1 |
均值为 A,标准差为 B 的拉普拉斯随机噪声 |
概率统计 |
|
1 0 |
栈为 [A | b];返回最小二乘解 x = A \ b |
特殊操作符 |
|
2 1 |
如果 A < B 则返回 1,否则为 0 |
逻辑运算 |
|
1 1 |
A 的中位数绝对偏差 (L1 STD) |
概率统计 |
|
2 1 |
A 基于权重 B 的加权中位数绝对偏差 (L1 STD) |
概率统计 |
|
2 1 |
A 和 B 的最大值 |
概率统计 |
|
1 1 |
A 的平均值 |
概率统计 |
|
2 1 |
A 基于权重 B 的加权平均值 |
概率统计 |
|
1 1 |
A 的中位数 |
概率统计 |
|
2 1 |
A 基于权重 B 的加权中位数 |
概率统计 |
|
2 1 |
A 和 B 的最小值 |
概率统计 |
|
2 1 |
A mod B (向下取整除法的余数) |
算术运算 |
|
1 1 |
A 的众数 (最小中位数平方估计) |
概率统计 |
|
2 1 |
A 基于权重 B 的加权众数 (最小中位数平方估计) |
概率统计 |
|
2 1 |
A x B (乘法) |
算术运算 |
|
2 1 |
如果 A 等于 B 则返回 NaN,否则返回 A |
逻辑运算 |
|
1 1 |
负值 (-A) |
算术运算 |
|
2 1 |
如果 A 不等于 B 则返回 1,否则为 0 |
逻辑运算 |
|
1 1 |
归一化 (A) 使得 min(A) = 0 且 max(A) = 1 |
概率统计 |
|
1 1 |
如果 A 等于 NaN 则为 NaN;如果 A 等于 0 则返回 1,否则为 0 |
逻辑运算 |
|
2 1 |
均值为 A,标准差为 B 的正态分布随机值 |
概率统计 |
|
2 1 |
如果 B 等于 NaN 则返回 NaN,否则返回 A |
逻辑运算 |
|
2 1 |
泊松累积分布函数 (x = A, lambda = B) |
概率统计 |
|
2 1 |
排列数 nPr (n = A, r = B) |
概率统计 |
|
3 1 |
伴随勒让德多项式 P(A),次数为 B,阶数为 C |
特殊函数 |
|
3 1 |
归一化伴随勒让德多项式 P(A),次数为 B,阶数为 C (地球物理规范) |
特殊函数 |
|
1 0 |
从栈中删除顶端元素 |
特殊操作符 |
|
2 1 |
A 的 B 次幂 |
算术运算 |
|
2 1 |
泊松分布 P(x, lambda) (x = A, lambda = B) |
概率统计 |
|
2 1 |
A 的第 B 个分位数 (0-100%) |
概率统计 |
|
3 1 |
A 基于权重 B 的第 C 个加权分位数 (0-100%) |
概率统计 |
|
1 1 |
A 的 Psi (或 Digamma) 函数 |
特殊函数 |
|
3 1 |
勒让德函数 Pv(A),阶数为 v = real(B) + imag(C) |
特殊函数 |
|
3 1 |
勒让德函数 Qv(A),阶数为 v = real(B) + imag(C) |
特殊函数 |
|
2 1 |
斜边的平方 (= A2 + B2) |
微积分/数学运算 |
|
1 1 |
弧度转换为度 |
特殊操作符 |
|
2 1 |
A 到 B 之间的均匀分布随机值 |
概率统计 |
|
1 1 |
瑞利累积分布函数 (z = A) |
概率统计 |
|
1 1 |
瑞利分布临界值 (alpha = A) |
概率统计 |
|
3 3 |
将 r,g,b 三元组转换为 h,s,v 三元组 (r,g,b 范围为 0-255) |
特殊操作符 |
|
3 3 |
将 r,g,b 三元组转换为 l,a,b 三元组 (r,g,b 范围为 0-255) |
特殊操作符 |
|
3 3 |
将 r,g,b 三元组转换为 x,y,z 三元组 (r,g,b 范围为 0-255) |
特殊操作符 |
|
1 1 |
Rint (A) (舍入到最接近 A 的整数) |
算术运算 |
|
1 1 |
A 的均方根 (Root-mean-square) |
算术运算 |
|
1 1 |
A 基于权重 B 的加权均方根 |
算术运算 |
|
2 0 |
将栈顶 A 个元素循环平移 B 个位置 |
特殊操作符 |
|
2 1 |
将 A 列视为 f(t) = 0 并返回其根 |
特殊操作符 |
|
2 1 |
将 A 在 t 方向上按常数 B 进行旋转平移 |
算术运算 |
|
1 1 |
瑞利概率密度函数 (z = A) |
概率统计 |
|
1 1 |
A 的正割(A 为弧度) |
微积分/三角函数 |
|
1 1 |
A 的正割(A 为度) |
微积分/三角函数 |
|
1 1 |
A 的符号 (+1 或 -1) |
逻辑运算 |
|
1 1 |
A 的正弦(A 为弧度) |
微积分/三角函数 |
|
1 1 |
归一化 Sinc 函数 |
特殊函数 |
|
1 1 |
A 的正弦(A 为度) |
微积分/三角函数 |
|
1 1 |
A 的双曲正弦 |
微积分/三角函数 |
|
1 1 |
A 的偏度 (Skewness) |
概率统计 |
|
1 1 |
平方 (2次幂) |
算术运算 |
|
1 1 |
平方根 |
算术运算 |
|
1 1 |
A 的标准差 |
概率统计 |
|
2 1 |
A 基于权重 B 的加权标准差 |
概率统计 |
|
1 1 |
赫维赛德阶跃函数 H(A) |
特殊函数 |
|
1 1 |
赫维赛德阶跃函数 H(t-A) |
特殊函数 |
|
2 1 |
A - B (减法) |
算术运算 |
|
1 1 |
A 的累加和 (Cumulative sum) |
算术运算 |
|
1 0 |
栈为 [A | b];通过 SVD 分解返回 x = A \ b |
特殊操作符 |
|
1 1 |
A 的正切(A 为弧度) |
微积分/三角函数 |
|
1 1 |
A 的正切(A 为度) |
微积分/三角函数 |
|
1 1 |
A 的双曲正切 |
微积分/三角函数 |
|
1 1 |
在末端余弦渐变到 0 的单位权重 |
特殊操作符 |
|
2 1 |
学生 t 累积分布函数 (t = A, nu = B) |
概率统计 |
|
2 1 |
学生 t 分布临界值 (alpha = A, nu = B) |
概率统计 |
|
2 1 |
B 阶切比雪夫多项式 Tn(-1<A<+1) |
特殊函数 |
|
2 1 |
学生 t 概率密度函数 (t = A, nu = B) |
概率统计 |
|
1 1 |
A 的最高值 (最大值) |
算术运算 |
|
1 1 |
A 的方差 |
概率统计 |
|
2 1 |
A 基于权重 B 的加权方差 |
概率统计 |
|
3 1 |
Von Mises 密度分布 V(x,mu,kappa) (角度=A, mu=B, kappa=C) |
概率统计 |
|
3 1 |
威布尔累积分布函数 (x=A, scale=B, shape=C) |
概率统计 |
|
3 1 |
威布尔分布临界值 (alpha=A, scale=B, shape=C) |
概率统计 |
|
3 1 |
威布尔密度分布 P(x,scale,shape) (x=A, scale=B, shape=C) |
概率统计 |
|
2 1 |
如果 A 等于 NaN 则返回 B,否则返回 A |
逻辑运算 |
|
3 3 |
将 x,y,z 三元组转换为 h,s,v 三元组 |
特殊操作符 |
|
3 3 |
将 x,y,z 三元组转换为 l,a,b 三元组 |
特殊操作符 |
|
3 3 |
将 x,y,z 三元组转换为 r,g,b 三元组 |
特殊操作符 |
|
1 1 |
A 的贝塞尔函数 (第二类, 0阶) |
特殊函数 |
|
1 1 |
A 的贝塞尔函数 (第二类, 1阶) |
特殊函数 |
|
2 1 |
A 的贝塞尔函数 (第二类, B阶) |
特殊函数 |
|
1 1 |
正态累积分布函数 (z = A) |
概率统计 |
|
1 1 |
正态分布临界值 (alpha = A) |
概率统计 |
|
1 1 |
正态概率密度函数 (z = A) |
概率统计 |
其他符号
以下符号具有特殊的含义:
标识符 |
描述/数值 |
|---|---|
|
圆周率 (3.1415926…) |
|
自然常数 (2.7182818…) |
|
欧拉常数 (0.5772156…) |
|
黄金分割率 (1.6180339…) |
|
单精度浮点数机器精度 (1.192092896e-07) |
|
双精度浮点数机器精度 (2.2204460492503131e-16) |
|
t 值的最小值 |
|
t 值的最大值 |
|
t 值的范围 |
|
t 的增量 |
|
记录的总数 |
|
包含 t 坐标的表 |
|
包含归一化 t 坐标的表 |
|
包含行号 (1, 2, …, N-1) 的表 |
上述符号均可以作为变量使用,当其为多个数时,逐元素操作。以 生成一维数组
中第一个实例中的 T 符号为例,其含义为将 -T 选项生成的序列转换为表,
以便后续使用 = 输出。
运算符注意事项
PLM 和 PLMg 运算符用来计算 L 阶 M 次 x 的缔合勒让德函数;各参数 的范围应该满足 -1 <= x <= +1 、0 <= M <= L。 PLM 运算符没有经过标准化, 并且乘以 phase (-1)^M。 PLMg 使用大地测量/地球物理常见的标准化。使用 -M 参数可以附加输出球谐系数 C 和 S。 PLM 在较高的阶次就会出现溢出,具 体和纬度相关, PLMg 则可以保证在 3000 阶以下都不会溢出
不同参数文件名相同时,应给定相对路径或绝对路径以区分不同文件
该模块计算过程保存在堆栈中,栈中保存结果最大为 100,即不能叠加太多的操作 以防溢出
所有需要半径的运算符为保证其为正值,均自动取绝对值后计算
DDT 和 DDT2 函数仅适用于等间隔数据
所有导数都基于 central finite differences 和 natural boundary conditions
ROOTS 必须是栈上最后一个操作,后面只能加 =
位运算符 BITAND,BITLEFT,BITNOT,BITOR,BITRIGHT, BITTEST 和 BITXOR 会将表数据中的双精度数转换为无符号的 64 位整数, 然后按位运算。因此,可储存在双精度数中的最大整数为 2^53 ,更大的数都会被 截断。如果被比较的数中包括 NaN ,则最终结果也为 NaN
TAPER will interpret its argument to be a width in the same units as the time-axis, but if no time is provided (i.e., plain data tables) then the width is taken to be given in number of rows.
颜色转换函数,例如 RGB2HSV 等,不仅包括 rgb 到 hsv 等三元数的转换, 还包括 lab 到 sRGB 等四元数的转换。这些函数在是否使用
-Q选项下的 表现不同。使用-Q时,输入应该为三元数,并将三个输出结果放在栈中。 由于只有栈顶的元素被打印,必须使用 POP 或 ROLL 等操作符来获取 其他感兴趣的项。如果没有-Q,GMT 将三元素视为整体,转换后,同样以 整体的方式返回到堆栈中。VPDF 运算符的输入数据单位为角度
存储、调用和清空
用户可以将中间计算结果储存到一个变量中,并在后续计算中调用该变量。这在需要 对某部分进行多次重复计算时可以提高效率和可读性。保存结果需要使用特殊的运算符 STO@label , 其中 label 是变量的名称。调用该变量时,使用 [RCL]@label , RCL 是可选的。使用后要清除该变量,可以使用 CLR@label , STO 和 CLR 均不影响计算中的堆栈。
宏
用户可以将特定的运算符组合保存为宏文件 gmtmath.macros 。文件中可以包含任意 数量的宏, # 开头的行为注释。宏的格式为
name = arg1 arg2 ... arg2[ : comment]
其中,name 是宏名,当此运算符出现在命令中时,则将其简单替换为参数列表。宏 不可以互相调用。下面将给出一个宏的例子:宏 DEPTH 将在时间列以 Myr 为单位给出海底构造的年龄,并计算预测的 half-space 海深
DEPTH = SQRT 350 MUL 2500 ADD NEG : usage: DEPTH to return half-space seafloor depths
由于在宏中可能使用地理或时间常数,因此可使用 : 后加一个空格的形式作为注释的开端。
下面是一个 GPSWEEK 宏,用于确定给定的时间处于的 GPS 周数(相对于某个参考时刻):
GPSWEEK = 1980-01-06T00:00:00 SUB 86400 DIV 7 DIV FLOOR : usage: GPS week without rollover
参与运算列的选择
-Ccols 设置后,任何操作,包括从文件中加载数据都会受到影响。因此,当 -Ccols
放在数据加载前时,只有设定的列会更新,其他的列会置为 0,若不想其他列置为 0,则需把文件放在
-Ccols 前。
绝对时间列
如果输入数据有多列并且包含绝对时间列(通过 -N [0] 设置 id),则时间输出为相对时间。
在标量计算模式(-Q)中,同样会将绝对时间转换为相对时间。如果 -C 选定的列中包含
绝对时间,同样会转换为相对时间。用户可以设置合适的 -f 或 -fo 选项来避免这种转换。
例如:如果需要计算时间差,则相对时间更加合适;如果要计算绝对时间,则需要使用 -fo 选项
设置输出时间格式为绝对时间。
对单位进行缩放
使用 -Q 计算时,请注意 GMT 内部将 c、i 或 p 等长度单位转换为 inch 计算,并对结果
进行缩放到设置的单位,但这仅在线性运算能得到正确的结果。例如
gmt math -Qp 1c 0.5i ADD =,其中 1c = 28.364p ,0.5i = 36p,且 ADD 为
线性运算,因此会得到正确的结果 64.346p。考虑另外一个例子:gmt math -Qc 1c 1c MUL =
,结果却不是 1,而是 0.393。原因是在非线性运算时, math 模块无法跟踪计算栈上单位,
因此在内部均假定以英寸为单位,在最后将结果缩放为 cm。这里在 math 内部计算的结果是 1
英寸的平方,math 将其转换为 0.3937 厘米* 英寸 作为单位,因此结果是错误的。
示例
将两种不同单位的长度相减,并赋值给 length 变量
length=`gmt math -Q 15c 2i SUB =`
计算不同单位的长度之间的比,输出无量纲
ratio=`gmt math -Qn 15c 2i DIV =`
对 process1 产生的数据进行开方,然后使用管道传递给 process3
process1 | gmt math STDIN SQRT = | process3
对两个数据文件进行平均,并对结果取 log10
gmt math file1.txt file2.txt ADD 0.5 MUL LOG10 = file3.txt
对包含海底地形年代(以 m.y. 为单位)和深度(以 m 为单位)的数据文件 samples.txt ,
使用公式 depth(单位为 m) = 2500 + 350 * sqrt (age) 计算正常深度,并最终获得深度异常
gmt math samples.txt T SQRT 350 MUL 2500 ADD SUB =
取三个文件对应列(第 1 列,第 4 到 6列)的平均值
gmt math -C1,4-6 sizes.1 sizes.2 ADD sizes.3 ADD 3 DIV = ave.txt
从含有一列数据的 ages.txt 文件中计算模值,并赋值给变量
mode_age=`gmt math -S -T ages.txt MODE =`
计算 t.txt 中坐标的 dilog(x) 函数值
gmt math -Tt.txt T DILOG = dilog.txt
下面展示一个使用存储变量的例子。将 (2*pi*T/360) 作为变量储存,对该变量分别 乘以 2 和 3 ,并对上述结果求余弦,然后加和
gmt math -T0/360/1 2 PI MUL 360 DIV T MUL STO@kT COS @kT 2 MUL COS ADD @kT 3 MUL COS ADD = harmonics.txt
使用 math 实现标量计算(不含输入文件)可以使用 -Q 选项,
计算 kei(((1 + 1.75)/2.2) + cos (60)) 并将结果赋值给 shell 中的变量 z
z=`gmt math -Q 1 1.75 ADD 2.2 DIV 60 COSD ADD KEI =`
将黄色的 RGB 值转换为 HSV 并保存为 hue
set hue=`gmt math -Q 255 255 0 RGB2HSV POP POP =`
下面将展示使用 math 求解方程组。假设当前存在一个增广矩阵 [ A |b ],
A 为系数矩阵,b 为等号右边的常数列,求解的方程组为 A * x = b 。LSQFIT 操作符可实现
方程的求解,但前提是使用 -A 选项正确放置参数。假定表数据文件 ty.txt 包含
t 和 y(t) 两列,拟合模型为 y(t) = a + b*t + c*H(t-t0) ,其中 H 为给定 t0 = 1.55 的
Heaviside 阶跃函数。这时,需要四列的增广矩阵,第二列为 t ,第四列为 y(t)(或者说 b) ,
则计算命令为
gmt math -N4/1 -Aty.txt -C0 1 ADD -C2 1.55 STEPT ADD -Ca LSQFIT = solution.txt
上面的例子中使用了 -C 选项来激活操作的列,并在 LSQFIT 求解前激活了所有列( -Ca );
第二列和第四列(列编号为 1 和 3)被设置为 t 和 y(t)。如果用户自己已经
准备了增广矩阵文件 lsqsys.txt , 求解将更加简单
gmt math -T lsqsys.txt LSQFIT = solution.txt
下面展示 -C 选项的位置对于数据加载的影响
echo 1 2 3 4 | gmt math STDIN -C3 1 ADD =
1 2 3 5
echo 1 2 3 4 | gmt math -C3 STDIN 1 ADD =
0 0 0 5
参考文献
Abramowitz, M., and I. A. Stegun, 1964, Handbook of Mathematical Functions, Applied Mathematics Series, vol. 55, Dover, New York.
Holmes, S. A., and W. E. Featherstone, 2002, A unified approach to the Clenshaw summation and the recursive computation of very high degree and order normalized associated Legendre functions. Journal of Geodesy, 76, 279-299.
Press, W. H., S. A. Teukolsky, W. T. Vetterling, and B. P. Flannery, 1992, Numerical Recipes, 2nd edition, Cambridge Univ., New York.
Spanier, J., and K. B. Oldman, 1987, An Atlas of Functions, Hemisphere Publishing Corp.