---
author: 周茂, 陈箫翰
date: 2026-01-21
---

# 生成一维数组

{doc}`/module/histogram`, {doc}`/module/makecpt`, {doc}`/module/math`, {doc}`/module/movie`, {doc}`/module/regress`,
{doc}`/module/sample1d`, {doc}`/module/talwani2d`, {doc}`/module/batch`, {doc}`/module/earthtide`,
{doc}`/module/filter1d`, {doc}`/module/grdinterpolate` 这些模块，它们的 **-T** 选项用法相同，都是用来创建一维数组。

下面将以 {doc}`/module/math` 为例，讲解 **-T***min/max/inc* 的用法（其中大部分操作也可通过linux 中的 seq 命令方便地实现）。

## 不使用任何子选项

生成一个从 *min* 到 *max*，步长为 *inc* 的等间隔数组，例如以 0.1 为步长，生成 3.1 到 4.2 的等间隔数组：

```bash
gmt math -o0 -T3.1/4.2/0.1 T =
3.1
3.2
3.3
3.4
3.5
3.6
3.7
...
```

## **+b** 选项

首先对 *min* 和 *max* 取 {math}`\log_2` ，取整到最近的整数作为新的起点和终点。以 *inc* 为步长，生成从新的起点到终点的整数序列。
再以这个整数序列中的每一个数为指数（假设为 *n* ），计算 {math}`2^n` ，生成最终的一维数组。

例如 **-T**3/20/1+b ，首先计算 {math}`\log_2 3 \approx 1.58` 取整为 2 ,以及 {math}`\log_2 20 \approx 4.32` 取整为 4 。
以 1 为步长生成整数序列 *2 3 4* 。再计算 {math}`2^2 = 4` , {math}`2^3 = 8` , {math}`2^4 = 16` ，最终生成一维数组：

```bash
gmt math -o0 -T3/20/1+b T =
4
8
16
```

## **+l** 选项

*min* 和 *max* 为最终生成的一维数组的数据范围。 *inc* 如果为正数，则只能有 1, 2, 3 三种取值：

- 1 ：生成 10 的幂次（1, 10, 100...）。
- 2 ：生成 1-2-5 序列（1, 2, 5, 10, 20, 50, 100...）。
- 3 ：生成 1-9 全序列（1, 2, 3...9, 10, 20...）。

然后再取出 *min* 和 *max* 之间的部分作为最终生成的一维数组。

例如， **-T**7/135/2+l 将生成：

```bash
gmt math -o0 -T7/135/2+l T =
10
20
50
100
```

首先生成完整的 1-2-5 序列： ... 1, 2, 5, **10, 20, 50, 100,** 200, 500 ...。
... 1, 2, 5（小于7）和 200, 500 ...（大于135）会被排除，而 **10 20 50 100** 为最终生成的一维数组。

同理， **-T**7/135/1+l 将生成：

```bash
gmt math -o0 -T7/135/1+l T =
10
100
```

**-T**7/135/3+l 将生成：

```bash
gmt math -o0 -T7/135/3+l T =
7
8
9
10
20
30
40
50
60
70
80
90
100
```

如果 *inc* 为负数，则可以取任意负数值。首先以 0 为中心，生成以 *inc* 为步长的序列：

- -1 ： ... -4, -3, -2, -1, 0, 1, 2, 3, 4 ...
- -2 ： ... -8, -6, -4, -2, 0, 2, 4, 6, 8 ...
- 以此类推

再以序列中的每一个元素为指数（假设为 *n* ），计算 {math}`10^n` ，取出 *min* 和 *max* 之间的部分作为最终生成的一维数组。

```bash
$ gmt math -o0 -T1e-4/1e4/-2+l T =
0.0001
0.01
1
100
10000

$ gmt math -o0 -T1e-16/1e16/-3+l T =
1e-15
1e-12
1e-09
1e-06
0.001
1
1000
1000000
1000000000
1e+12
1e+15
```

## **+i** 选项

以 *inc* 的倒数为步长生成从 *min* 到 *max* 的一维数组。
例如在 {doc}`/module/movie` 中为持续 1 分钟的每秒 24 帧动画设置时间：

```bash
gmt math -o0 -T0/60/24+i T =
0
0.0416666666667
0.0833333333333
0.125
0.166666666667
...
60
```

## **+n** 选项

*inc* 表示等间隔一维数组元素的个数。例如以 3.44 和 7.82 为起点和终点，生成长度为 5 的等间隔一维数组：

```bash
gmt math -o0 -T3.44/7.82/5+n T =
3.44
4.535
5.63
6.725
7.82
```

## **-T** 后直接加文件或逗号分隔的数列

**-T** 后可以直接加文件名，文件内容即为要生成的一维数组。也可以直接给出逗号分隔的数列，例如前 6 个斐波那契数：

```bash
gmt math -o0 -T0,1,1,2,3,5 T =
0
1
1
2
3
5
```

**注**：(1) 如果需要通过数据集文件传递列表节点但希望被理解为列表（即不进行插值），则必须设置文件头包含字符串 "LIST"。
(2) 如果文件或者逗号分隔的数列中有重复数字或未排序，可以使用 **+u** 选项去重并排序。
(3) 如果数列只包含一个值，必须在其后加逗号以表明仍是一个数列，以免被误判为步长。

## 时间序列

如果模块支持绝对时间序列，在 *inc* 后分别添加 **y** ，**o** ，**d** ，**h** ， **m**
和 **s** 表示时间步长的单位为年，月，日，时，分，秒。在其后附加 **+t** 选项，可以进一步强调生成时间序列，也可以不加。

例如生成表示 2020 年 3 月的前 7 天的时间序列：

```bash
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
```

## **+a** 选项

少数模块允许使用 **+a**，该选项不对生成的数列进行运算操作，而是将该数列以列的形式追加到输出表数据。
类似 linux 中的 paste 命令。

## 生成距离序列

如果模块允许设置空间距离序列，可以使用输入数据的前两列计算距离，并生成等间距序列。

在 *inc* 后分别添加 **d**，**m**，**s**，**e**，**f**，**M**，**n** 和 **u**
表示距离步长的单位为度，分，秒，米，英尺，公里，英里，海里，测量英尺。参见 {doc}`/option/distcal` 了解计算模式。
如果为笛卡尔坐标，必须使用特殊单位 **c** 作为距离步长单位。

## **+e** 选项

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