GMTで描こう Part 3: gmtmath
gmtmath
モジュール
本稿ではGMT6のgmtmath
について解説します。このモジュールは数学的な演算をデータテーブルに対して施すという機能を持っています。よく似た名前のモジュールにgrdmath
がありますが、こちらはnetCDFのグリッドファイルを扱うという点で異なります。(なお、シェル上で実行する際にはgmt math
とスペースを入れて入力するのでmathと呼ぶ方が良いかもしれませんが、Documentationの表記に従ってgmtmath
とします。)
gmtmath
はテーブルを入力として受け取り、または実行時にテーブルを生成して、指定された演算を各行に実行し、結果に出力します。演算指示を与えるには逆ポーランド記法の構文を使います。
逆ポーランド記法
逆ポーランド記法(Reverse Polish Notation, RPN)は、数式の記述方法の一つで、演算子(operator)を被演算子(オペランド、operand)の後ろに置く表記法です。この特徴から後置記法 (Postfix Notation) と呼ばれることもあります。通常の記法による数式の
2 + 3
は、逆ポーランド記法では
2 3 +
となります。より複雑なものになると、
(a + b) / (c - d)
は、
a b + c d - /
となります。このように逆ポーランド記法では式の評価順序を指定する括弧が不要となります。この特徴はコンピューターに計算を指示する際に都合がよく、単純な処理で計算を実行できます。
gmtmath
の使い方
基本的な使い方
以下のような、2列のファイルdat.txt
を用意します。
$ cat dat.txt
1 1
2 2
3 3
4 4
5 5
このファイルを入力とし、各行2列目の数値を10倍にして標準出力するコマンドは次のようになります。
$ gmt math dat.txt 10 MUL =
1 10
2 20
3 30
4 40
5 50
入力のdat.txt
と定数10
はオペランドで、MUL
は乗算の演算子です。逆ポーランド記法で表記するので、演算子はオペランドの後ろに来ています。この例のようにgmtmath
で使う演算子はすべて大文字の英字です。四則演算+ - * /
はそれぞれ、ADD, SUB, MUL, DIV
となります。他にも様々な数学関数が100以上用意されています(三角関数、指数関数、双曲線関数 etc. 詳しくはDocumentationを参照してください)。末尾は出力先指定で、=
のみの場合は標準出力になります。= filename
のようにすることで、計算結果をファイルに保存できます。
なお、オペランドにはテーブルファイル(ASCII)、定数、予約されたシンボル(PI, E, T
(後述)など)を指定できます。入力として複数個のテーブルファイルを与えて計算することも可能です。
テーブルを生成する
入力ファイルを用意しなくても、-T
オプションを使えばその場でテーブルを用意できます。
$ gmt math -T0/360/5 T SIND =
0 0
5 0.0871557427477
10 0.173648177667
15 0.258819045103
20 0.342020143326
25 0.422618261741
30 0.5
35 0.573576436351
...
-T
のその引数に(始点)/(終点)/(増分)
のような形式で与えることで、数値のテーブルを得ることができます。上の例では、0から360までを5の間隔で出力するように命令しています。その後ろのT
はオペランドで、生成した数値のテーブルそれ自身を示します。SIND
は度数法の正弦関数を意味する単項演算子です。
三角関数をプロットしてみる
gmtmath
で得られた結果は、パイプラインで直接別のコマンド・モジュールに渡すことができます。以下のシェルスクリプトでは、結果をplot
モジュールに渡して三角関数を描画しています。
#!/bin/bash
range=0/360/5
gmt begin sin_cos png
gmt basemap -JX10c/7c -R0/360/-1.1/1.1 -Bxa90g90f30+u@. -Bya0.5f0.1g1 -BWeSn
gmt math -T$range T SIND = | gmt plot -W1p,red -l"sin"
gmt math -T$range T COSD = | gmt plot -W1p,blue -l"cos"
gmt legend -DjBL+jBL+o0.5/0.5 -F+pblack+gwhite
gmt end show

番外編:1列テーブルを作成する
-o
オプションを使うと出力する列を絞ることができます。-o0
とすると1列目のみを、-o1
とすると2列目のみを出力します。以下では後者を指定することで、演算された結果のみのテーブルを出力しています。
$ gmt math -o1 -T0/10/2 T 100 MUL =
0
200
400
600
800
1000
まとめ
gmtmath
はデータテーブルを入力にして、数学的な操作を各行に施した結果を出力します。- その操作は逆ポーランド記法で指定します。指定された演算はすべての行に対して実行されます。
- 出力した結果をパイプラインで渡して、
plot
することができます。
このモジュールは、演算子を組み合わせることで様々なグラフを描画できます。プログラムを書くほどではないが、awkで書くのは面倒な処理に向いているのではないでしょうか。またアニメーションを作る際に必要なデータテーブルを用意するのにも有用だと思います。
アニメーションを作るmovie
モジュールや、上の図を作るのに使った凡例を表示するlegend
モジュールについては、今後記事を書く予定です。