✍️ 周茂 • 📅 2026-01-05

# math

官方文档:

  math

简介:

  表数据的逆波兰表示法（RPN）计算

math 使用逆波兰表示法（Reverse Polish Notation）对一个或多个表数据文件或者 常量进行加减乘除等操作。逆波兰表示法是一种后缀表示法，即将运算符写在操作数之后。 该模块可以计算任意复杂的运算。模块默认逐元素进行计算操作。其中某些运算符仅 需要一个参数。如果输入中不含表文件，则可以使用 `-T` 或 `-N` 选项。默认 情况下，除了时间以外的列，所有的列都参与运算（见 `-C` ）。如果多个运算整体 非常复杂或者频繁出现，可以编写为宏以便后续使用。

## 语法

gmt math [ `-A` t_f(t)[+e][+r][+s|w] ] [ `-C` cols ] [ `-E` eigen ] [ `-I` ] [ `-N` n_col[/t_col] ] [ `-Q`[c|i|p|n] ] [ `-S`[f|l] ] [ `-T`[min/max/inc[+b|i|l|n]|file|list] ] [ `-V`[level] ] [ `-bi` binary ] [ `-bo` binary ] [ `-d` nodata[+c col] ] [ `-e` regexp ] [ `-f` flags ] [ `-g` gaps ] [ `-h` headers ] [ `-i` flags ] [ `-o` flags ] [ `-q` flags ] [ `-s` flags ] [ `-w` flags ] [ --PAR=value ] operand [ operand ] OPERATOR [ operand ] OPERATOR ... = [ outfile ]

## 输入输出数据

operand

  如果 operand 是一个文件，GMT 将试着以表文件的形式读取该文件。如果非文件， 将被解析为 其他符号 。 若为 STDIN ，表示将读取标准输入并放入堆栈中。 如果有必要， STDIN 参数可以多次出现。

= outfile

  输出表数据文件名，不指定的情况下写到标准输出

## 可选选项

-A

-A t_f(t)[+e][+r][+s|w]

  建立并求解线性方程。 该选项需要 `-N` n_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

-C cols

  选择要运算的列 cols 。多列以逗号分隔，类似 1,3-5,7 的表达形式也是允许 的；此外，-Cx 等效于 -C0，-Cy 等效于 -C1。使用不带任何参数的 `-C` 选项 可用来重置，即选择除时间列外的所有列（见 `-N` ）。-Ca 选择所有的列， 包括时间列， -Cr 的作用是反向选择，即选择除当前已选定的列以外的其他 列。

-E

-E eigen

  设置 LSQFIT 和 SVDFIT 运算符的特征值，默认为 1e-7。比 1e-7 更小的 特征值将被重置为 0 ，并在求解中不考虑。

-I

-I

  将输出数据从升序变为降序 [默认为升序]

-N

-N n_col[/t_col]

  设置列数和时间所在的列，列从 0 开始计数，默认输入列最大编号 n_clo 为 2 ， 时间列 t_col 位于第 0 列。

-Q

-Q[c|i|p|n]

  实现不同长度单位之间的快速计算， -Ca `-N`1/0 `-T`0/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]z gap[+n|p]

  确定数据或线段的间断。 (参数详细介绍)

-h

-h[i|o][n][+c][+d][+m segheader][+r remark][+t title]

  在读/写数据时跳过文件开头的若干个记录。 (参数详细介绍)

-i

-i cols[+l][+s scale][+o offset][,...][,t[word]]

  对输入的数据进行列选择以及简单的代数运算。 (参数详细介绍)

-o

-o cols[,...][,t[word]]

  对输出的数据进行列选择以及简单的代数运算。 (参数详细介绍)

-q

-q[i|o][~]rows[+c col][+a|f|s]

  对输入或输出的行进行筛选，该选项在一定程度上可以代替 gawk 的某些功能。 (参数详细介绍)

-s

-s[cols][+a|+r]

  设置 NaN 记录的处理方式。 (参数详细介绍)

-w

-wy|a|w|d|h|m|s|c period[/phase][+c col]

  将输入坐标转换为循环坐标。 (参数详细介绍)

-^ 或 -

  显示简短的帮助信息，包括模块简介和基本语法信息（Windows下只能使用 -）

-+ 或 +

  显示帮助信息，包括模块简介、基本语法以及模块特有选项的说明

-? 或无参数

  显示完整的帮助信息，包括模块简介、基本语法以及所有选项的说明

--PAR=value

  临时修改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. PLM 和 PLMg 运算符用来计算 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. DDT 和 DDT2 函数仅适用于等间隔数据

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

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

8. 位运算符 BITAND，BITLEFT，BITNOT，BITOR，BITRIGHT， BITTEST 和 BITXOR 会将表数据中的双精度数转换为无符号的 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` 时，输入应该为三元数，并将三个输出结果放在栈中。 由于只有栈顶的元素被打印，必须使用 POP 或 ROLL 等操作符来获取 其他感兴趣的项。如果没有 `-Q` ，GMT 将三元素视为整体，转换后，同样以 整体的方式返回到堆栈中。

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

## 参与运算列的选择

-C cols 设置后，任何操作，包括从文件中加载数据都会受到影响。因此，当 `-C` cols 放在数据加载前时，只有设定的列会更新，其他的列会置为 0，若不想其他列置为 0，则需把文件放在 -C cols 前。

## 绝对时间列

如果输入数据有多列并且包含绝对时间列（通过 `-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