累次評価演算子はカッコ()
とカンマ,
からなる演算子です。その一般的な使い方は以下のようなものです。
(式1, 式2, ... , 式N)
この場合、gnuplotは式1
から順に実行していき、最後の式N
を評価した時の値を演算子からの値として返します。
まず、最も簡単な例を示します。
(a=1, b=2, a+b)
この例では、a=1
という式とb=2
という式が順に実行された後にa+b
という式が実行されて評価されます。従って、上式の返す結果は3
ということになります。
はっきり言って、これだけでは全くこの演算子のご利益はありません。この演算子の大きな役割の一つは、plot
コマンド中で用いて、1つ以上前のデータ行の値を参照することです。
例えば、以下では現在の行のデータとひとつ前の行のデータの差をプロットする例を示します。まず、step.dat
を、以下のように、0+1+2+...+nの値を含むデータファイルであるとします。
0
1
3
6
10
15
21
28
36
45
55
66
78
91
105
このファイルを普通にプロットすると下のようになります。
plot "step.dat" using 0:1
一方、以下のように類似評価演算子を用いることで、以下のようにしてひとつ前のデータとの差分をプロットできます。
old = 0
plot "step.dat" using 0:(dx = $1-old, old = $1, dx)
この例では、まずdxという変数に、現在のデータ行の値とoldという変数の値の差を代入しておきます。このoldには一つ前の行のデータが入っています。次に、次の行で使うために、old=$1
の部分で今のデータ行の値をoldに上書きします。そして、最後にdxの値を返します。これを各データ行に対して繰り返すことで、前のデータ行との差分が取れるわけです。実際に実行した例を以下に示します。
このように、確かに差分がプロットされています。
ちなみに、最初のold=0
の行があるのは、oldという変数が定義されていないとデータファイルの最初の行をプロットする際にエラーが出てしまうためです。実は、このような書き方ではデータファイルの最初の行の値が0でなかったりする場合などに問題が起きる場合があります。より一般的に使えるスクリプトにするには、以下のようにします。
plot "step.dat" using 0:($0==0 ? (old = $1, 1/0) : (dx = $1-old, old = $1, dx))
この例では、三項演算子を用いた条件分岐をつけています。すなわち、データファイルの最初の行(0行目; $0
が0
)の場合には変数oldにデータファイルの1列目の値($1
)を代入し、値としては1/0
を返します。つまり、0行目を読んだ場合はプロットは行われません。1行目以降は(dx = $1-old, old = $1, dx)
の部分が実行されるため、先の例と同じく、差分がプロットされます。
実行例は以下の通りです。横軸が0のところのデータ点が無くなっている点に注目して下さい。これは先ほど述べたように、データの0行目に関しては1/0
が返されているためにプロットが行われないからです。
上の例でもわかるように、類似評価演算子はうまく使うと普通のplot
だけではできなかった操作をできるようになります。このページではそのような例をいくつか紹介していますので、以下にそれらへのリンクを貼っておきます。