Credits | Overview | Plotting Styles | Commands | Terminals |
---|
コマンド function は、gnuplot コードからなる名前付きブロックのヒアド キュメント形式による定義を意味する符号で、それは関数として呼び出すこと が可能です。 データブロックと同様、関数 (function) ブロックの名前は '$' で始まる必 要があります。その定義には、最大 9 つの名前付きの引数を指定できます。 それらの名前は、その関数ブロック内で局所変数として扱われます。以下参照: local, scope。
一度関数ブロックを定義すると、それを通常の関数を呼び出すのと同じように どこでもその名前で呼び出すことができます。返り値が適切でない場合、関数 ブロックを、数式の一部としてでなく、コマンド "evaluate" で呼び出すこと ができます。
例:
function $sinc(arg) << EOF if (arg == 0) { return 1.0 } return sin(arg) / arg EOF
gnuplot> plot $sinc(x) with lines title "sinc(x) as a function block"
名前付き引数の一覧は、関数ブロックの宣言時に指定する必要はありません。 コマンドラインで指定した関数の引数は、関数ブロックの内部から、コマンド call でそうするように ARGV[1] などの形でアクセスできます。これにより、 可変な個数の引数を操作できる関数ブロックを定義することができます。
例:
function $max << EOF local max = real("-Inf") if (ARGC == 0) { return NaN } do for [i=1:ARGC] { if (max < ARGV[i]) { max = ARGV[i] } } return max EOF gnuplot> foo = $max( f(A), 2.0, C, Array[3] ) gnuplot> baz = $max( foo, 100. )
関数ブロックをサポートする一番の目的は、複雑な関数を gnuplot 内部で直 接定義できるようにすることです。もちろん、同じ関数を C や Fortran でコ ードした場合よりも実行速度は遅くなりますが、これは色々な目的に答えるこ とを可能にします。実行速度が重要な場合は、代わりにその関数を別にプラグ インとして実装すればいいでしょう (以下参照: plugins)。
関数ブロックを使う 2 つ目の目的は、gnuplot コマンドが、これを使う以外 には存在できないような状況でその実行を可能にすることです。例えばあなた が 2 つの CSV ファイルからのデータを描画したいが、一つのファイルはフィ ールドがカンマ区切りで、もう一方はセミコロン区切りであるとします。通常 この属性に対しては、事前にコマンド set datafile をセットしますが、そ れは plot コマンドが使用するすべてのファイルに適用されてしまいます。し かし我々は、各ファイルが plot コマンドで参照される直前にそれを設定する ように呼びだすような関数ブロックを定義できます。
function $set_csv(char) << EOF set datafile separator char EOF plot tmp=$set_csv(",") FILE1, tmp=$set_csv(";") FILE2
制限:
関数ブロックを使う自明でない例として、複素対数ガンマ関数 lngamma に対 する 15 項 Lanczos 近似の実装とグラフがデモコレクション内にあります。 function_block.dem この関数ブロックによる実装は、同じアルゴリズムで C で直接コードされて いる組み込み関数の lnGamma と比べて、だいたい 25 倍位遅いですが、それ でも対話型での 3 次元グラフの回転には十分な位の速さです。
関数ブロックの使用は試験段階です。 詳細は、リリース版に含まれる前に変更される可能性があります。