:author: 周茂
:date: 2026-01-05

.. index:: ! math
.. program:: math

math
=======

:官方文档: :doc:`gmt:gmtmath`
:简介: 表数据的逆波兰表示法（RPN）计算

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

语法
----

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

输入输出数据
------------------------

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

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

可选选项
--------

.. option:: -A

**-A**\ *t_f(t)*\ [**+e**]\ [**+r**]\ [**+s**\|\ **w**]
    建立并求解线性方程。
    该选项需要 :option:`-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)* 的第三列为权重

    具体使用方法见倒数第二个示例。

.. option:: -C

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

.. option:: -E

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

.. option:: -I

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

.. option:: -N

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

.. option:: -Q

**-Q**\ [**c**\|\ **i**\|\ **p**\|\ **n**]
    实现不同长度单位之间的快速计算， **-Ca** :option:`-N`\ 1/0  :option:`-T`\ 0/0/1 的简写。
    在进行不同单位的长度计算时，在计算前都转换为 *inch* ，然后计算，并将结果
    转换为 :term:`PROJ_LENGTH_UNIT` 设置的单位。使用 **c** ， **i** ， **p**
    可设置对应的输出长度单位。 **n** 表示输出结果无量纲。

.. option:: -S

**-S**\ [**f**\|\ **l**]
    仅输出结果的第一行 [默认为所有行]。这在输出统计结果的时候可能会
    有用（比如 **MODE** 运算）。 **l** 和 **f** 分别表示第一行和最后一行。

.. option:: -T

**-T**\ [*min*/*max*/*inc*\ [**+b**\|\ **i**\|\ **l**\|\ **n**]\|\ *file*\|\ *list*]
    不加任何选项和文件，表明没有输入文件。其他详见 :doc:`/array` 。

.. include:: explain_-V.rst_

.. include:: explain_-bi.rst_

.. include:: explain_-bo.rst_

.. include:: explain_-d.rst_

.. include:: explain_-e.rst_

.. include:: explain_-f.rst_

.. include:: explain_-g.rst_

.. include:: explain_-h.rst_

.. include:: explain_-icols.rst_

.. include:: explain_-ocols.rst_

.. include:: explain_-q.rst_

.. include:: explain_-s.rst_

.. include:: explain_-w.rst_

.. include:: explain_help.rst_

运算符
------

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

.. list-table:: 运算符列表
   :widths: 15 10 55 20
   :header-rows: 1
   :class: fixed-width-table

   * - 运算符 (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
     - d\ :sup:`2`\ (A)/dt\ :sup:`2` 中央二阶导数
     - 微积分/三角函数
   * - ``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 (A\ :sup:`2` + B\ :sup:`2`))
     - 微积分/数学运算
   * - ``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
     - log\ :sub:`10` (A) (以 10 为底的对数)
     - 算术运算
   * - ``LOG1P``
     - 1 1
     - log (1+A) (自然对数，对极小值 A 更精确)
     - 算术运算
   * - ``LOG2``
     - 1 1
     - log\ :sub:`2` (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
     - 斜边的平方 (= A\ :sup:`2` + B\ :sup:`2`)
     - 微积分/数学运算
   * - ``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)
     - 概率统计

其他符号
--------

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

.. list-table:: 数学常量与表变量
   :widths: 20 80
   :header-rows: 1

   * - 标识符
     - 描述/数值
   * - ``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) 的表

上述符号均可以作为变量使用，当其为多个数时，逐元素操作。以 :doc:`/array` 
中第一个实例中的 **T** 符号为例，其含义为将 :option:`-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 等四元数的转换。这些函数在是否使用 :option:`-Q` 选项下的
   表现不同。使用 :option:`-Q` 时，输入应该为三元数，并将三个输出结果放在栈中。
   由于只有栈顶的元素被打印，必须使用 **POP** 或 **ROLL** 等操作符来获取
   其他感兴趣的项。如果没有 :option:`-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

参与运算列的选择
----------------

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

绝对时间列
----------

如果输入数据有多列并且包含绝对时间列（通过 :option:`-N` [0] 设置 id)，则时间输出为相对时间。
在标量计算模式（:option:`-Q`）中，同样会将绝对时间转换为相对时间。如果 :option:`-C` 选定的列中包含
绝对时间，同样会转换为相对时间。用户可以设置合适的 **-f** 或 **-fo** 选项来避免这种转换。
例如：如果需要计算时间差，则相对时间更加合适；如果要计算绝对时间，则需要使用 **-fo** 选项
设置输出时间格式为绝对时间。

对单位进行缩放
---------------

使用 :option:`-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 为单位）的数据文件 :file:`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

从含有一列数据的 :file:`ages.txt` 文件中计算模值，并赋值给变量 ::

    mode_age=`gmt math -S -T ages.txt MODE =`

计算 :file:`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** 实现标量计算（不含输入文件）可以使用 :option:`-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** 操作符可实现
方程的求解，但前提是使用 :option:`-A` 选项正确放置参数。假定表数据文件 :file:`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

上面的例子中使用了 :option:`-C` 选项来激活操作的列，并在 **LSQFIT** 求解前激活了所有列（ **-Ca** ）;
第二列和第四列（列编号为 1 和 3）被设置为 t 和 y(t)。如果用户自己已经
准备了增广矩阵文件 :file:`lsqsys.txt` ， 求解将更加简单 ::

    gmt math -T lsqsys.txt LSQFIT = solution.txt

下面展示 :option:`-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.

相关模块
--------

:doc:`grdmath`
