累次評価演算子

累次評価演算子について

累次評価演算子はカッコ()とカンマ,からなる演算子です。その一般的な使い方は以下のようなものです。

(式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行目; $00)の場合には変数oldにデータファイルの1列目の値($1)を代入し、値としては1/0を返します。つまり、0行目を読んだ場合はプロットは行われません。1行目以降は(dx = $1-old, old = $1, dx)の部分が実行されるため、先の例と同じく、差分がプロットされます。

実行例は以下の通りです。横軸が0のところのデータ点が無くなっている点に注目して下さい。これは先ほど述べたように、データの0行目に関しては1/0が返されているためにプロットが行われないからです。

累次評価演算子の活用例

上の例でもわかるように、類似評価演算子はうまく使うと普通のplotだけではできなかった操作をできるようになります。このページではそのような例をいくつか紹介していますので、以下にそれらへのリンクを貼っておきます。