gnuplot : 条件によって式の処理を変える方法(三項演算子、?:、ternary)

条件によって式の処理を変える

 gnuplotには与えられた条件によって処理を変える方法が備わっています。ifコマンドもそれになりますが、今回はそれ以外の三項演算子というのを紹介します。
(ifでは文が評価され、三項演算子では式が評価されるという違いがあるそうです)

 三項演算子は英語では「ternary operator」となるようです。また用いられる記号で「?:」と表すこともあるようです。さて、三項演算子と言われても何のことだかよく分からないと思うので、始めに簡単な例を示すことにします。

三項演算子の簡単な例 その1

 gnuplotでplotコマンドを実行するとき、以下の条件でプロットする式を変えるものとします。
  • xが0未満では「y=x」をプロット
  • xが0以上では「y=cos(x)」 をプロット
 これを三項演算子を用いて書き表すと
gnuplot> plot x<0 ? x : cos(x)
となります。このときグラフは次のようにプロットされます。
 グラフを見れば"0"を境にプロットされる式が変わっていることが分かります。
では、ここで上記の三項演算子を用いて書いたplot文を見てみることにします。
plot x<0 ? x : cos(x)
一見して何がどうなってるのか分からない書き方になっていると思います。
簡単に説明すると、上の文はplotを除くと以下の5つのパーツから形成されています。
  • x<0 (条件)
  • ? (記号)
  • x (式)
  • : (記号)
  • cos(x) (式)
 まず1番目に設定する条件が来ます。その後ろに"?"という記号が来て、条件が正(True)の場合の処理が続きます(ここでは"x")。そしてその後の":"の記号の後ろに条件が偽(False)の場合の処理が続きます(ここではcos(x))。
 説明があっても分かり難いと思いますが、実際に条件と式で書き下して実行してみると使い方に慣れてくると思います。

例 その2

次の例として以下の条件を考えてみることにします。
  1. -5<x<5 では y = 1
  2. それ以外の領域では y = 0
 1つ目の条件は "-5<x && x<5" と書き下せます。ここで使っている"&&"はANDの条件です。そして1つ目の条件をTrueとして、2つ目をFalseとすれば、これは以下のようなコマンドとなります。
gnuplot> plot [][-1:2] -5<x && x<5 ? 1 : 0
(グラフを見やすくするようy軸の値を設定しています)

例 その3 (ユーザー関数)

 ここまではplotコマンドで使う方法を例にしましたが、他のコマンドでも用いることも出来ます。この例ではユーザー関数を三項演算子を用いた三項演算子を作ってみることにします。とは言ってもそう難しくはなく、「例その1」のplotの式をユーザー関数として書くと以下のようになります。
f(x) =  x<0 ? x : cos(x)

例 その他

 ここまでxの値について条件を付けて来ましたが、変数の値を条件にしたり、plotやユーザー関数以外で用いたりすることも出来ます。
グラフタイトルの設定ではこういうのとかも出来ますね。
set title a==1 ? "setting 1" : "non setting"


条件の入れ子構造

 ここまでは単純な例を用いて説明してきました。
次に、もう少し複雑に1つの式に条件をいくつか入れる入れ子にしてみることを考えます。やり方としては、三項演算子のFalseの部分に別の三項演算子を書いていくというカタチになるでしょう。
説明は省きますが、例えば以下のような書き方となります。
gnuplot> plot [-3:4][-1:5] x<-1 ? 0 : x<0 ? 1 : x<1 ? 2 : x<2 ? 3 : 4

ユーザー関数での入れ子

g(x)というある条件を当てはめた三項演算子を用いたユーザー関数を作り、それをユーザー関数f(x)内で三項演算子の要素として利用する、ということも出来るようです。

入れ子にしたときの条件の順序

 範囲を区切った条件の場合、入れ子にするときは小さい値から条件設定をしていく必要があるようです。
(まだあまり調べてないので、詳しくはまたの機会に)


条件に当てはまる部分をプロットしない方法(1/0)

 ある条件ではプロットする必要ないという場合もあるでしょう。
その場合、プロットする式の部分に"1/0"と書いておくと、そこの条件に当てはまる部分はプロットされなくなります。
gnuplot> plot [-3:4][-1:5] x<-1 ? 0 : x<0 ? 1 : x<1 ? 2 : x<2 ? 3 :1/0

まとめ

 とりあえず調べた範囲での三項演算子の使い方についてまとめてみました。おそらくはここで紹介したことより応用的な使い方も出来るとは思います。いろいろな処理が絡むようなプロットでも使いどころが出てくるでしょう。
 実際に実用的にどういった使い方があるのかなど、またまとめていきたいと思います。


その他、gnuplot関連のブログ記事

コメント

スポンサーリンク


このブログの人気の投稿

gnuplotでプロットなどの色をcolornameの指定で変更する

catコマンドの出力を行番号付きにするためのコマンドラインオプション(-n, -b)

Ubuntu Softwareが起動しないのでいろいろと調べてみる(Ubuntu 20.04.1 LTS)

gnuplot : グラフにグリッド線を描く方法(set grid)

gnuplot : プロット画像のサイズ指定について(set sizeとの違い)