✍️ 周茂  •  📅 2026-01-05

math

官方文档:

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) 文件只包含 tf(t) 两列。 在增广矩阵中,t 变量于 编号为 t_col 指定的列, f(t) 位于编号为 n_col - 1 的列。

  • +e 使用 LSQFITSVDFIT 操作符时,使用该选项,可以求解拟合系数 。结果包括 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

设置 LSQFITSVDFIT 运算符的特征值,默认为 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 设置的单位。使用 cip 可设置对应的输出长度单位。 n 表示输出结果无量纲。

-S
-S[f|l]

仅输出结果的第一行 [默认为所有行]。这在输出统计结果的时候可能会 有用(比如 MODE 运算)。 lf 分别表示第一行和最后一行。

-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 后分别添加 yodhms 表示时间步长的单位为年,月,日,时,分,秒。在其后附加 +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 后分别添加 dmsefMnu 表示距离步长的单位为度,分,秒,米,英尺,公里,英里,海里,英尺。如果 为笛卡尔坐标,使用 c 作为距离步长单位。

+e 选项

如果只给定 inc 而从数据中获取最大值和最小值,则 (max - min)/inc 可能 不是整数,GMT 讲会自动对 inc 进行一定的调整。如果不想调整 inc ,则可以 使用 +e 选项,GMT 会固定最小值,适当调整最大值。

运算符

Operator 为运算符名称; args 分别表示输入参数和输出参数个数; Returns 中的 A B C … 等字符表示输入参数。 所有的三角函数运算符默认输入为弧度,若运算符最后一个字母为 D 表示使用角度计算。

运算符列表

运算符 (Operator)

参数 (args)

返回值 (Returns)

函数类型 (Type)

ABS

1 1

A 的绝对值

算术运算

ACOS

1 1

反余弦(结果为弧度)

微积分/三角函数

ACOSD

1 1

反余弦(结果为度)

微积分/三角函数

ACOSH

1 1

反双曲余弦

微积分/三角函数

ACOT

1 1

反余切(结果为弧度)

微积分/三角函数

ACOTD

1 1

反余切(结果为度)

微积分/三角函数

ACSC

1 1

反余割(结果为弧度)

微积分/三角函数

ACSCD

1 1

反余割(结果为度)

微积分/三角函数

ADD

2 1

A + B(加法)

算术运算

AND

2 1

如果 A 等于 NaN 则返回 B,否则返回 A

逻辑运算

ASEC

1 1

反正割(结果为弧度)

微积分/三角函数

ASECD

1 1

反正割(结果为度)

微积分/三角函数

ASIN

1 1

反正弦(结果为弧度)

微积分/三角函数

ASIND

1 1

反正弦(结果为度)

微积分/三角函数

ASINH

1 1

反双曲正弦

微积分/三角函数

ATAN

1 1

反正切(结果为弧度)

微积分/三角函数

ATAN2

2 1

A/B 的反正切(结果为弧度)

微积分/三角函数

ATAN2D

2 1

A/B 的反正切(结果为度)

微积分/三角函数

ATAND

1 1

反正切(结果为度)

微积分/三角函数

ATANH

1 1

反双曲正切

微积分/三角函数

BCDF

3 1

二项分布累积分布函数 (p = A, n = B, x = C)

概率统计

BEI

1 1

开尔文函数 bei (A)

特殊函数

BER

1 1

开尔文函数 ber (A)

特殊函数

BITAND

2 1

A & B (按位与运算)

逻辑运算

BITLEFT

2 1

A << B (按位左移运算)

算术运算

BITNOT

1 1

~A (按位非运算,即返回补码)

逻辑运算

BITOR

2 1

A | B (按位或运算)

逻辑运算

BITRIGHT

2 1

A >> B (按位右移运算)

算术运算

BITTEST

2 1

如果 A 的第 B 位被设置则返回 1,否则为 0 (按位测试)

逻辑运算

BITXOR

2 1

A ^ B (按位异或运算)

逻辑运算

BPDF

3 1

二项分布概率密度函数 (p = A, n = B, x = C)

概率统计

CEIL

1 1

ceil (A) (大于或等于 A 的最小整数)

逻辑运算

CHICDF

2 1

卡方累积分布函数 (chi2 = A, nu = B)

概率统计

CHICRIT

2 1

卡方分布临界值 (alpha = A, nu = B)

概率统计

CHIPDF

2 1

卡方概率密度函数 (chi2 = A, nu = B)

概率统计

COL

1 1

将 A 列压入栈中

特殊操作符

COMB

2 1

组合数 nCr (n = A, r = B)

概率统计

CORRCOEFF

2 1

相关系数 r(A, B)

概率统计

COS

1 1

A 的余弦(A 为弧度)

微积分/三角函数

COSD

1 1

A 的余弦(A 为度)

微积分/三角函数

COSH

1 1

A 的双曲余弦

微积分/三角函数

COT

1 1

A 的余切(A 为弧度)

微积分/三角函数

COTD

1 1

A 的余切(A 为度)

微积分/三角函数

CSC

1 1

A 的余割(A 为弧度)

微积分/三角函数

CSCD

1 1

A 的余割(A 为度)

微积分/三角函数

D2DT2

1 1

d2(A)/dt2 中央二阶导数

微积分/三角函数

D2R

1 1

度转换为弧度

特殊操作符

DDT

1 1

d(A)/dt 中央一阶导数

微积分/三角函数

DEG2KM

1 1

球面度转换为公里

特殊操作符

DENAN

2 1

用 B 中的值替换 A 中的 NaN

逻辑运算

DIFF

1 1

A 相邻元素间的前向差分 (A[1]-A[0], A[2]-A[1], …, NaN)

算术运算

DILOG

1 1

双对数 (Spence’s) 函数

特殊函数

DIV

2 1

A / B (除法)

算术运算

DUP

1 2

在栈中复制一份 A

特殊操作符

ECDF

2 1

指数累积分布函数 (x = A, lambda = B)

概率统计

ECRIT

2 1

指数分布临界值 (alpha = A, lambda = B)

概率统计

EPDF

2 1

指数概率密度函数 (x = A, lambda = B)

概率统计

EQ

2 1

如果 A 等于 B 则返回 1,否则为 0

逻辑运算

ERF

1 1

误差函数 erf (A)

概率统计

ERFC

1 1

互补误差函数 erfc (A)

概率统计

ERFINV

1 1

A 的反误差函数

概率统计

EXCH

2 2

交换栈中的 A 和 B

特殊操作符

EXP

1 1

e 的次幂

算术运算

FACT

1 1

A! (A 的阶乘)

算术运算

FCDF

3 1

F 累积分布函数 (F = A, nu1 = B, nu2 = C)

概率统计

FCRIT

3 1

F 分布临界值 (alpha = A, nu1 = B, nu2 = C)

概率统计

FLIPUD

1 1

反转每一列的顺序

特殊操作符

FLOOR

1 1

小于或等于 A 的最大整数

逻辑运算

FMOD

2 1

A % B (截断除法的余数)

算术运算

FPDF

3 1

F 概率密度函数 (F = A, nu1 = B, nu2 = C)

概率统计

GE

2 1

如果 A >= B 则返回 1,否则为 0

逻辑运算

GT

2 1

如果 A > B 则返回 1,否则为 0

逻辑运算

HSV2LAB

3 3

h,s,v 三元组转换为 l,a,b 三元组 (h=A[0-360], s=B, v=C[0-1])

特殊操作符

HSV2RGB

3 3

h,s,v 三元组转换为 r,g,b 三元组 (h=A[0-360], s=B, v=C[0-1])

特殊操作符

HSV2XYZ

3 3

h,s,v 三元组转换为 x,t,z 三元组 (h=A[0-360], s=B, v=C[0-1])

特殊操作符

HYPOT

2 1

直角三角形的斜边长度 (= sqrt (A2 + B2))

微积分/数学运算

I0

1 1

A 的修正贝塞尔函数 (第一类, 0阶)

特殊函数

I1

1 1

A 的修正贝塞尔函数 (第一类, 1阶)

特殊函数

IFELSE

3 1

如果 A 不等于 0 则返回 B,否则返回 C

逻辑运算

IN

2 1

A 的修正贝塞尔函数 (第一类, B阶)

特殊函数

INRANGE

3 1

如果 B <= A <= C 则返回 1,否则为 0

逻辑运算

INT

1 1

对 A 进行数值积分

微积分/数学运算

INV

1 1

取倒数 (1/A)

算术运算

ISFINITE

1 1

如果 A 是有限值则返回 1,否则为 0

逻辑运算

ISNAN

1 1

如果 A 等于 NaN 则返回 1,否则为 0

逻辑运算

J0

1 1

A 的贝塞尔函数 (第一类, 0阶)

特殊函数

J1

1 1

A 的贝塞尔函数 (第一类, 1阶)

特殊函数

JN

2 1

A 的贝塞尔函数 (第一类, B阶)

特殊函数

K0

1 1

A 的修正开尔文函数 (第二类, 0阶)

特殊函数

K1

1 1

A 的修正贝塞尔函数 (第二类, 1阶)

特殊函数

KEI

1 1

开尔文函数 kei (A)

特殊函数

KER

1 1

开尔文函数 ker (A)

特殊函数

KM2DEG

1 1

公里转换为球面度

特殊操作符

KN

2 1

A 的修正贝塞尔函数 (第二类, B阶)

特殊函数

KURT

1 1

A 的峰度 (Kurtosis)

概率统计

LAB2HSV

3 3

l,a,b 三元组转换为 h,s,v 三元组

特殊操作符

LAB2RGB

3 3

l,a,b 三元组转换为 r,g,b 三元组

特殊操作符

LAB2XYZ

3 3

l,a,b 三元组转换为 x,y,z 三元组

特殊操作符

LCDF

1 1

拉普拉斯累积分布函数 (z = A)

概率统计

LCRIT

1 1

拉普拉斯分布临界值 (alpha = A)

概率统计

LE

2 1

如果 A <= B 则返回 1,否则为 0

逻辑运算

LMSSCL

1 1

A 的 LMS (最小中位数平方) 尺度估计 (LMS STD)

概率统计

LMSSCLW

2 1

A 基于权重 B 的加权 LMS 尺度估计 (LMS STD)

概率统计

LOG

1 1

log (A) (自然对数)

算术运算

LOG10

1 1

log10 (A) (以 10 为底的对数)

算术运算

LOG1P

1 1

log (1+A) (自然对数,对极小值 A 更精确)

算术运算

LOG2

1 1

log2 (A) (以 2 为底的对数)

算术运算

LOWER

1 1

A 的最低值 (最小值)

算术运算

LPDF

1 1

拉普拉斯概率密度函数 (z = A)

概率统计

LRAND

2 1

均值为 A,标准差为 B 的拉普拉斯随机噪声

概率统计

LSQFIT

1 0

栈为 [A | b];返回最小二乘解 x = A \ b

特殊操作符

LT

2 1

如果 A < B 则返回 1,否则为 0

逻辑运算

MAD

1 1

A 的中位数绝对偏差 (L1 STD)

概率统计

MADW

2 1

A 基于权重 B 的加权中位数绝对偏差 (L1 STD)

概率统计

MAX

2 1

A 和 B 的最大值

概率统计

MEAN

1 1

A 的平均值

概率统计

MEANW

2 1

A 基于权重 B 的加权平均值

概率统计

MEDIAN

1 1

A 的中位数

概率统计

MEDIANW

2 1

A 基于权重 B 的加权中位数

概率统计

MIN

2 1

A 和 B 的最小值

概率统计

MOD

2 1

A mod B (向下取整除法的余数)

算术运算

MODE

1 1

A 的众数 (最小中位数平方估计)

概率统计

MODEW

2 1

A 基于权重 B 的加权众数 (最小中位数平方估计)

概率统计

MUL

2 1

A x B (乘法)

算术运算

NAN

2 1

如果 A 等于 B 则返回 NaN,否则返回 A

逻辑运算

NEG

1 1

负值 (-A)

算术运算

NEQ

2 1

如果 A 不等于 B 则返回 1,否则为 0

逻辑运算

NORM

1 1

归一化 (A) 使得 min(A) = 0 且 max(A) = 1

概率统计

NOT

1 1

如果 A 等于 NaN 则为 NaN;如果 A 等于 0 则返回 1,否则为 0

逻辑运算

NRAND

2 1

均值为 A,标准差为 B 的正态分布随机值

概率统计

OR

2 1

如果 B 等于 NaN 则返回 NaN,否则返回 A

逻辑运算

PCDF

2 1

泊松累积分布函数 (x = A, lambda = B)

概率统计

PERM

2 1

排列数 nPr (n = A, r = B)

概率统计

PLM

3 1

伴随勒让德多项式 P(A),次数为 B,阶数为 C

特殊函数

PLMg

3 1

归一化伴随勒让德多项式 P(A),次数为 B,阶数为 C (地球物理规范)

特殊函数

POP

1 0

从栈中删除顶端元素

特殊操作符

POW

2 1

A 的 B 次幂

算术运算

PPDF

2 1

泊松分布 P(x, lambda) (x = A, lambda = B)

概率统计

PQUANT

2 1

A 的第 B 个分位数 (0-100%)

概率统计

PQUANTW

3 1

A 基于权重 B 的第 C 个加权分位数 (0-100%)

概率统计

PSI

1 1

A 的 Psi (或 Digamma) 函数

特殊函数

PV

3 1

勒让德函数 Pv(A),阶数为 v = real(B) + imag(C)

特殊函数

QV

3 1

勒让德函数 Qv(A),阶数为 v = real(B) + imag(C)

特殊函数

R2

2 1

斜边的平方 (= A2 + B2)

微积分/数学运算

R2D

1 1

弧度转换为度

特殊操作符

RAND

2 1

A 到 B 之间的均匀分布随机值

概率统计

RCDF

1 1

瑞利累积分布函数 (z = A)

概率统计

RCRIT

1 1

瑞利分布临界值 (alpha = A)

概率统计

RGB2HSV

3 3

r,g,b 三元组转换为 h,s,v 三元组 (r,g,b 范围为 0-255)

特殊操作符

RGB2LAB

3 3

r,g,b 三元组转换为 l,a,b 三元组 (r,g,b 范围为 0-255)

特殊操作符

RGB2XYZ

3 3

r,g,b 三元组转换为 x,y,z 三元组 (r,g,b 范围为 0-255)

特殊操作符

RINT

1 1

Rint (A) (舍入到最接近 A 的整数)

算术运算

RMS

1 1

A 的均方根 (Root-mean-square)

算术运算

RMSW

1 1

A 基于权重 B 的加权均方根

算术运算

ROLL

2 0

将栈顶 A 个元素循环平移 B 个位置

特殊操作符

ROOTS

2 1

将 A 列视为 f(t) = 0 并返回其根

特殊操作符

ROTT

2 1

将 A 在 t 方向上按常数 B 进行旋转平移

算术运算

RPDF

1 1

瑞利概率密度函数 (z = A)

概率统计

SEC

1 1

A 的正割(A 为弧度)

微积分/三角函数

SECD

1 1

A 的正割(A 为度)

微积分/三角函数

SIGN

1 1

A 的符号 (+1 或 -1)

逻辑运算

SIN

1 1

A 的正弦(A 为弧度)

微积分/三角函数

SINC

1 1

归一化 Sinc 函数

特殊函数

SIND

1 1

A 的正弦(A 为度)

微积分/三角函数

SINH

1 1

A 的双曲正弦

微积分/三角函数

SKEW

1 1

A 的偏度 (Skewness)

概率统计

SQR

1 1

平方 (2次幂)

算术运算

SQRT

1 1

平方根

算术运算

STD

1 1

A 的标准差

概率统计

STDW

2 1

A 基于权重 B 的加权标准差

概率统计

STEP

1 1

赫维赛德阶跃函数 H(A)

特殊函数

STEPT

1 1

赫维赛德阶跃函数 H(t-A)

特殊函数

SUB

2 1

A - B (减法)

算术运算

SUM

1 1

A 的累加和 (Cumulative sum)

算术运算

SVDFIT

1 0

栈为 [A | b];通过 SVD 分解返回 x = A \ b

特殊操作符

TAN

1 1

A 的正切(A 为弧度)

微积分/三角函数

TAND

1 1

A 的正切(A 为度)

微积分/三角函数

TANH

1 1

A 的双曲正切

微积分/三角函数

TAPER

1 1

在末端余弦渐变到 0 的单位权重

特殊操作符

TCDF

2 1

学生 t 累积分布函数 (t = A, nu = B)

概率统计

TCRIT

2 1

学生 t 分布临界值 (alpha = A, nu = B)

概率统计

TN

2 1

B 阶切比雪夫多项式 Tn(-1<A<+1)

特殊函数

TPDF

2 1

学生 t 概率密度函数 (t = A, nu = B)

概率统计

UPPER

1 1

A 的最高值 (最大值)

算术运算

VAR

1 1

A 的方差

概率统计

VARW

2 1

A 基于权重 B 的加权方差

概率统计

VPDF

3 1

Von Mises 密度分布 V(x,mu,kappa) (角度=A, mu=B, kappa=C)

概率统计

WCDF

3 1

威布尔累积分布函数 (x=A, scale=B, shape=C)

概率统计

WCRIT

3 1

威布尔分布临界值 (alpha=A, scale=B, shape=C)

概率统计

WPDF

3 1

威布尔密度分布 P(x,scale,shape) (x=A, scale=B, shape=C)

概率统计

XOR

2 1

如果 A 等于 NaN 则返回 B,否则返回 A

逻辑运算

XYZ2HSV

3 3

x,y,z 三元组转换为 h,s,v 三元组

特殊操作符

XYZ2LAB

3 3

x,y,z 三元组转换为 l,a,b 三元组

特殊操作符

XYZ2RGB

3 3

x,y,z 三元组转换为 r,g,b 三元组

特殊操作符

Y0

1 1

A 的贝塞尔函数 (第二类, 0阶)

特殊函数

Y1

1 1

A 的贝塞尔函数 (第二类, 1阶)

特殊函数

YN

2 1

A 的贝塞尔函数 (第二类, B阶)

特殊函数

ZCDF

1 1

正态累积分布函数 (z = A)

概率统计

ZCRIT

1 1

正态分布临界值 (alpha = A)

概率统计

ZPDF

1 1

正态概率密度函数 (z = A)

概率统计

其他符号

以下符号具有特殊的含义:

数学常量与表变量

标识符

描述/数值

PI

圆周率 (3.1415926…)

E

自然常数 (2.7182818…)

EULER

欧拉常数 (0.5772156…)

PHI

黄金分割率 (1.6180339…)

EPS_F

单精度浮点数机器精度 (1.192092896e-07)

EPS_D

双精度浮点数机器精度 (2.2204460492503131e-16)

TMIN

t 值的最小值

TMAX

t 值的最大值

TRANGE

t 值的范围

TINC

t 的增量

N

记录的总数

T

包含 t 坐标的表

TNORM

包含归一化 t 坐标的表

TROW

包含行号 (1, 2, …, N-1) 的表

上述符号均可以作为变量使用,当其为多个数时,逐元素操作。以 生成一维数组 中第一个实例中的 T 符号为例,其含义为将 -T 选项生成的序列转换为表, 以便后续使用 = 输出。

运算符注意事项

  1. PLMPLMg 运算符用来计算 L 阶 M 次 x 的缔合勒让德函数;各参数 的范围应该满足 -1 <= x <= +1 、0 <= M <= L。 PLM 运算符没有经过标准化, 并且乘以 phase (-1)^M。 PLMg 使用大地测量/地球物理常见的标准化。使用 -M 参数可以附加输出球谐系数 C 和 S。 PLM 在较高的阶次就会出现溢出,具 体和纬度相关, PLMg 则可以保证在 3000 阶以下都不会溢出

  2. 不同参数文件名相同时,应给定相对路径或绝对路径以区分不同文件

  3. 该模块计算过程保存在堆栈中,栈中保存结果最大为 100,即不能叠加太多的操作 以防溢出

  4. 所有需要半径的运算符为保证其为正值,均自动取绝对值后计算

  5. DDTDDT2 函数仅适用于等间隔数据

  6. 所有导数都基于 central finite differences 和 natural boundary conditions

  7. ROOTS 必须是栈上最后一个操作,后面只能加 =

  8. 位运算符 BITANDBITLEFTBITNOTBITORBITRIGHTBITTESTBITXOR 会将表数据中的双精度数转换为无符号的 64 位整数, 然后按位运算。因此,可储存在双精度数中的最大整数为 2^53 ,更大的数都会被 截断。如果被比较的数中包括 NaN ,则最终结果也为 NaN

  9. 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.

  10. 颜色转换函数,例如 RGB2HSV 等,不仅包括 rgb 到 hsv 等三元数的转换, 还包括 lab 到 sRGB 等四元数的转换。这些函数在是否使用 -Q 选项下的 表现不同。使用 -Q 时,输入应该为三元数,并将三个输出结果放在栈中。 由于只有栈顶的元素被打印,必须使用 POPROLL 等操作符来获取 其他感兴趣的项。如果没有 -Q ,GMT 将三元素视为整体,转换后,同样以 整体的方式返回到堆栈中。

  11. VPDF 运算符的输入数据单位为角度

存储、调用和清空

用户可以将中间计算结果储存到一个变量中,并在后续计算中调用该变量。这在需要 对某部分进行多次重复计算时可以提高效率和可读性。保存结果需要使用特殊的运算符 STO@label , 其中 label 是变量的名称。调用该变量时,使用 [RCL]@labelRCL 是可选的。使用后要清除该变量,可以使用 CLR@labelSTOCLR 均不影响计算中的堆栈。

用户可以将特定的运算符组合保存为宏文件 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.

相关模块

grdmath