Math

## 概要

描画は隣接平均, 数式変換などデータの加工を行った後に行われます。 グラフを作成する際その処理手順を意識することが重要な場合があります。 以下にデータの流れを示します。
データ
↓
数式変換
↓
マスクされたデータを削除
↓
移動されたデータを移動
↓
隣接平均
↓
[曲線の補間係数, 最小二乗フィットの係数を求める]
↓
出力(グラフ描画)
ロググラフを作成する場合, 曲線の補間はデータを対数変換した後に行われるので通常の線形グラフとロググラフでは結果が異なります。 最小二乗法に関してはロググラフでも通常の線形グラフと同じ係数を求めます。

## ブロック

- 複数の式を {} で囲むことにより、一つの式（ブロック）として扱うことができます。
- {} 内で最後に評価された式の値がブロックの値となります。
- 後述する if() 関数などの引数に使うことで複雑な処理を行うことができるようになります。
- ブロック内部では関数・定数の定義は行なえません。
- 空のブロックは 0 と等価です。
- ブロックは変数のスコープには影響しません。

## 数式変換で使用できるコメント

#から行末までをコメントと見なします。

## 数式変換で使用できる数値リテラル

1
1.0
1.0E3

  浮動小数点

0xffff

  16進整数

0b1011

  2進整数

0o377

  8進整数

数字が連続している部分は見やすくするため任意の箇所に空白を入れることができます (例 123 456.789 E8) 。

## 数式変換で使用できる定数

PI | 円周率
E | 自然対数の底
EULER | オイラーの定数
NAN | 欠損データ エラー表示
UNDEF | 欠損データ エラー非表示
CONT | 欠損データ (データ線は結合)
BREAK | 欠損データ (データ線は分断)
NUM | データの個数
MINX | (X) column の生データの最小値
MAXX | (X) column の生データの最大値
MINY | (Y) column の生データの最小値
MAXY | (Y) column の生データの最大値
SUMX | (X) column の生データの和
SUMY | (Y) column の生データの和
SUMXX | (X) column の生データの二乗和
SUMYY | (Y) column の生データの二乗和
SUMXY | (X) column, (Y) column の生データの積和
AVX | (X) column の生データの平均
AVY | (Y) column の生データの平均
STDEVPX | (X) column の生データの標準偏差 (SGX も利用可)
STDEVPY | (Y) column の生データの標準偏差 (SGY も利用可)
STDEVX | (X) column の生データの不偏標準偏差
STDEVY | (Y) column の生データの不偏標準偏差
FIRST | diagonal, errorbar など一行のデータで2回の変換が行われる場合、1回目の呼出しで真(=1)、2回目の呼出しで偽(=0)
MASK | マスクに設定された行数
MOVE | 移動に設定された行数
COLX | 「X カラム」に指定された数
COLY | 「Y カラム」に指定された数
AXISX | 「X 軸」に指定された axis オブジェクトの ID
AXISX_MIN | 「X 軸」の最小値
AXISX_MAX | 「X 軸」の最大値
AXISX_LEN | 「X 軸」の長さ
AXISY | 「Y 軸」に指定された axis オブジェクトの ID
AXISY_MIN | 「Y 軸」の最小値
AXISY_MAX | 「X 軸」の最大値
AXISY_LEN | 「Y 軸」の長さ
HSKIP | 「先頭スキップ行」に指定された行数
RSTEP | 「読込ステップ行」に指定された行数
FLINE | 「最終行」に指定された行数
DATA_OBJ | data オブジェクトのオブジェクト識別番号
PATH_OBJ | path オブジェクトのオブジェクト識別番号
RECT_OBJ | rectangle オブジェクトのオブジェクト識別番号
ARC_OBJ | arc オブジェクトのオブジェクト識別番号
MARK_OBJ | mark オブジェクトのオブジェクト識別番号
TEXT_OBJ | text オブジェクトのオブジェクト識別番号
%D | データの番号
%N | データオブジェクトのインスタンス数
TRUE | 代表的な真の値
FALSE | 偽の値
FILL_RULE_NONE | ポリゴンを塗りつぶさない。draw_polygon() 関数で利用する。
FILL_RULE_EVEN_ODD | ポリゴンを偶奇則で塗りつぶす。draw_polygon() 関数で利用する。
FILL_RULE_WINDING | ポリゴンをワインディング則で塗りつぶす。draw_polygon() 関数で利用する。

## 定数定義

const x=exp | x は英字または _ で始まり英数字または _ から構成される文字列、exp は任意の数式。 既存の定数は上書きできません。 数式 exp は数式変換実行時ではなく構文解析時に評価されます。 数式 exp 中ではパラメータ、関数 sum(), dif(), on_end() は使用できません。

## 数式変換で使用できるパラメータ

%0 | データを読み込んだ順番に1から番号をつけたときの値
%1〜%999 | 同一行中 1〜999 カラムの生データ
%Fxx1〜%Fxx999 | データ xx の同じ行の 1〜999 カラムの生データ

## 数式変換で使用できる変数

変数は X, Y の変換式で独立です。

定数に使用されていない、英字または _ で始まり英数字または _ から構成される文字列（x, y 以外）。 | ユーザが自由に使用できます (代入されていない変数は 0 に初期化されています) 。
x | (x)column の生のデータ (変数への代入は可能ですが、データ読込時に生データで上書きされます)
y | (y)column の生のデータ (変数への代入は可能ですが、データ読込時に生データで上書きされます)

## 配列

col[n] | col[0] はパラメータ %0 とおなじ、それ以外は同一行中 n カラムの 生データ (999 カラム以降も参照可能)。 配列の要素への代入は可能ですが、データ読込時に生データで上書きされます。
x[n] | x は英字または _ で始まり英数字または _ から構成される文字列、n は任意の数式。 未代入の配列要素は 0 に初期化されています。 配列の添字は整数に丸められます。 配列の添字の上限は 65535 です。 配列の添字に負の数値を使用した場合、配列の末尾からのインデックスとみなします。

## 数式変換で使用できる文字列、文字列変数と文字列の配列

### 注意

文字列の扱いについては今の所試験的な実装です。今後、仕様変更などの可能性があります。

### 文字列リテラル

- 文字列はダブルクォートまたはシングルクォートで囲まれています。
- ダブルクォートで囲まれた文字列ではバックスラッシュ記法が有効です。
- シングルクォートで囲まれた文字列では \\ と \' を除いて文字列の中身 の解釈は行われません。

#### バックスラッシュ記法

\t
  タブ(0x09)
\n
  改行(0x0a)
\r
  キャリッジリターン(0x0d)
\f
  改ページ(0x0c)
\b
  バックスペース (0x08)
\a
  ベル (0x07)
\v
  垂直タブ (0x0b)
\nnn
  8 進数表記 (n は 0-7)
\xnn
  16 進数表記 (n は 0-9,a-f)

#### 式展開

ダブルクォートで囲まれた文字列の中では#{式}という形式で式の内容(を文字列 化したもの)を埋め込むことができます。文字#に続く文字が {でなければ、その まま文字#として解釈されます。明示的に式展開を止めるには#の前にバックスラッ シュを置きます。式が文字列リテラル、文字列変数、文字列配列の要素の場合は その文字列が埋め込まれます。それ以外の場合は式を評価した値が適当な文字列 に変換されて埋め込まれます。

### 文字列変数

$ に続き英字または _ で始まり英数字または _ から構成される文字列。

### 文字列の配列

- $col[n]

- $col[0]は読み込み中のデータの行全体、それ以外は同一行中 n カラムの文字列。
- 配列の要素への代入は可能ですが、データ読込時に新しい行の文字列で上書きされます。

- $x[n]

- x は英字または _ で始まり英数字または _ から構成される文字列。
- 配列の添字は整数に丸められます。
- 配列の添字の上限は 65535 です。
- 配列の添字に負の数値を使用した場合、配列の末尾からのインデックスとみなします。

### 文字列の値

数値の計算が行われる箇所で、文字列は数値に変換されます。

### 演算子

文字列変数・文字列配列の要素に対しては、代入演算子 = および比較演算子 ==, != のみが使用できます。

比較演算子 ==, != の両辺が文字列リテラル、文字列変数、文字列配列の場合は文字列としての比較が行われます。

文字列変数に対する代入演算子 = の右辺に数値がある場合は数値を変換した文字列が代入されます。

### 文字列操作関数

文字列操作関数

## ユーザ定義関数

def func(a,b,...) {exp} | 仮引数 a, b, ... の関数 func を定義します。 配列を渡すときは仮引数を @a の様に指定してください。配列は参照渡しとなります。 exp には任意の数式を指定できますが、以下の制限があります。 パラメータ (%0, %F0001 など) は使用できません。 関数 dif(), sum(), on_end() は使用できません。 関数定義はネストできません。 関数は変数に関して独立したスコープを持ちます。

## 数式変換で使用できる演算子

-+ | 符号
!(前置) | 論理否定
+ - * / | 四則演算
\ | 浮動小数点剰余
^ | ベキ乗
!(後置) | 階乗(引数は 169 以下の正の整数)
= | 代入
-= | 自己代入
+= | 自己代入
*= | 自己代入
/= | 自己代入
\= | 自己代入
^= | 自己代入
^= | 自己代入
^= | 自己代入
&= | 自己代入
|= | 自己代入
<<= | 自己代入
>>= | 自己代入
== | 比較
!= | 比較
<= | 比較
>= | 比較
< | 比較
> | 比較
&& | 論理積
|| | 論理和
& | ビットAND
| | ビットOR
~ | ビットNOT
<< | 左シフト
>> | 右シフト

exp1 && exp2 と and(exp1, exp2) の違い。

  exp1 && exp2 は exp1 が偽の時 exp2 を評価しません。また exp1 が真の場合、exp2 を評価した値を返します。

exp1 || exp2 と or(exp1, exp2) の違い。

  exp1 || exp2 は exp1 が真の時 exp2 を評価しません。また exp1 が真の場合は exp1、exp1 が偽の場合は exp2 を評価した値を返します。

;

  ; は式の終端を表します。; の後に別の式を続けることができます(後に式が続かない場合は省略可能)。

括弧 ()

  括弧 () の数に制限はありません。

乗算演算子 *

  乗算であることが明らかな場合には乗算演算子を省略することができます。 (例：2 * PI * x → 2 PI x)

ビット演算子
  - ビット演算は被演算子を符号付き整数に変換して行われます。
  - 負数に対するビットシフト演算は処理系依存です。環境により結果が異なる場合があります。
  - ビットシフト演算でシフト量に負の値を指定した場合、逆向きのシフトとして扱われます。 (例：2<<-1 は 2>>1 と同等)

## 演算子の優先順位

演算子 + - (正負の符号) の優先順位が Version 6.03 以前と異なっています。

高 | !(後置)
↑ | ^
| !(前置) ~ + - (正負の符号)
| * / \
| + -
| << >>
| < <= > >=
| == !=
| &
| &&
↓ | ||
低 | =(+=, -= ... )

## 数式変換で使用できる関数

- 数値の引数は省略することができます。引数が省略された場合 0 が渡されます。
- if() 関数のネスト数、dif(), sum() 関数の数の制限はなくなりました。
- 引数は左から評価されます。

### 変換関数

abs(x) | 絶対値
sign(x) | 正負の符号 (x < 0 で -1、x >= 0 で 1)
int(x) | 0に向かって切捨てた整数部
gauss(x) | ガウスの記号[ ] ([n]はnを越えない最大の整数)
frac(x) | 小数部
round(x, digit) | 四捨五入した値。 digit で四捨五入した結果の桁数を指定します。 (例：round(1.25, 1) → 1.3)
min(a,b,c,...) | 引数のうちもっとも小さな値
max(a,b,c,...) | 引数のうちもっとも大きな値
sumsq(a,b,c,...) | 引数の自乗和

### 初等関数

sqr(x) | 二乗
sqrt(x) | 平方根
exp(x) | 指数(x≦690)
expm1(x) | exp(x)-1、x が 0 の近傍でも正確な値が計算できる方法が用いられる。
ln(x) | 自然対数
ln1p(x) | ln(1+x)、x の値が 0 に近い場合でも正確に計算できる方法が用いられる。
log(x) | 常用対数
log1p(x) | log(1+x)、x の値が 0 に近い場合でも正確に計算できる方法が用いられる。
sin(x) | サイン
cos(x) | コサイン
tan(x) | タンジェント
asin(x) | 逆サイン
acos(x) | 逆コサイン
atan(x) | 逆タンジェント
sinh(x) | ハイパボリックサイン
cosh(x) | ハイパボリックコサイン
tanh(x) | ハイパボリックタンジェント
asinh(x) | 逆ハイパボリックサイン
acosh(x) | 逆ハイパボリックコサイン
atanh(x) | 逆ハイパボリックタンジェント
fmod(x, y) | x を y で割った浮動小数点剰余
choose(n,m) | the combinatorial factor n choose m: n!/(m!(n-m)!)

### 特殊関数

rand(x) | 0≦RAND(x)＜x (x＞0のとき)の乱数
srand(x) | RAND() 関数で作られる疑似乱数系列の新しい種を設定する。
theta(x) | 階段関数(x≧0 のとき 1, それ以外は 0 )
delta(x) | クロネッカーのδ(x=0 のとき 1, それ以外は 0)
gamma(x) | ガンマ関数 Γ(x)
icgam(m,x) | 不完全ガンマ関数 Γ(μ,x)
erf(x) | 誤差関数 Erf(x)
erfc(x) | 相補誤差関数 Erfc(x)
qinv(x) | 誤差関数 Erfc(x) の逆関数
ei(x) | 積分指数関数 Ei(x)
beta(p,q) | ベータ関数 B(p,q)
icbeta(a,b,x) | 不完全ベータ関数 I(a,b,x) (0 <= x <= 1)
jn(n,x) | 第1種n次ベッセル関数
yn(n,x) | 第2種n次ベッセル関数
in(n,x) | 第1種n次変形ベッセル関数
kn(n,x) | 第2種n次変形ベッセル関数
jl(l,x) | 第1種l次球ベッセル関数
yl(l,x) | 第2種l次球ベッセル関数
jnu(nu,x) | 第1種nu次ベッセル関数 (nu は正の実数)
ynu(nu,x) | 第2種nu次ベッセル関数 (nu は正の実数)
inu(nu,x) | 第1種nu次変形ベッセル関数 (nu は正の実数)
knu(nu,x) | 第2種nu次変形ベッセル関数 (nu は正の実数)
pn(n,x) | ルジャンドル多項式
lgn(n,a,x) | ラゲール倍多項式
hn(n,x) | エルミート多項式
tn(n,x) | チェビシフ多項式
zeta(x) | リーマンゼータ関数 ζ(x)
zeta_int(x) | リーマンゼータ関数 ζ(x) (x は整数)
zetam1(x) | リーマンゼータ関数 ζ(x) - 1
zetam1_int(x) | リーマンゼータ関数 ζ(x) - 1 (x は整数)

### 日付時刻関数

mjd(year,month,day,hour,min,sec) | 修正ユリウス日(year, month, day はグレゴリオ暦、hour,min,sec は UTC 時刻、うるう秒は考慮されない)
unix2mjd(time) | 修正ユリウス日(time は 1970年1月1日00:00:00 UTC からの経過秒数、うるう秒は考慮されない)
mjd2unix(mjd) | 修正ユリウス日 mjd の1970年1月1日00:00:00 UTC からの経過秒数(うるう秒は考慮されない)
mjd2year(mjd) | 修正ユリウス日に対応するグレゴリオ暦の年
mjd2month(mjd) | 修正ユリウス日に対応するグレゴリオ暦の月
mjd2day(mjd) | 修正ユリウス日に対応するグレゴリオ暦の日
mjd2wday(mjd) | 修正ユリウス日に対応するグレゴリオ暦の曜日 (1:月曜日 から 7:日曜日)
mjd2yday(mjd) | 修正ユリウス日に対応するグレゴリオ暦の 1 月 1 日からの通算日数 (1 から 366)
time() | 紀元 (1970年1月1日00:00:00 UTC) からの経過時間を秒単位で返す。
mtime() | ファイルの最終修正時刻を返す。
strftime($str, $fmt, t, utc) | 時刻 t (紀元からの経過秒数)を $fmt で指定された書式指定にしたがって変換し文字列 $str に書き込む。utc が 0 の時はローカル時刻、それ以外の場合は協定世界時 (UTC) に変換する。

### 論理関数

- 0 を偽, それ以外を真とする。

eq(x,y,prec) | x＝y のとき真(=1)。prec で比較の桁数を指定できる (prec == 0 は完全一致) 。
neq(x,y,prec) | x≠y のとき真(=1)。prec で比較の桁数を指定できる (prec == 0 は完全一致) 。
ge(x,y,prec) | x≧y のとき真(=1)。prec で比較の桁数を指定できる (prec == 0 は桁数指定なし) 。
gt(x,y,prec) | x＞y のとき真(=1)。prec で比較の桁数を指定できる (prec == 0 は桁数指定なし) 。
le(x,y,prec) | x≦y のとき真(=1)。prec で比較の桁数を指定できる (prec == 0 は桁数指定なし) 。
lt(x,y,prec) | x＜y のとき真(=1)。prec で比較の桁数を指定できる (prec == 0 は桁数指定なし) 。
not(x) | x＝0 のとき真(=1)
or(x,y) | (x≠0) or (y≠0) のとき真(=1)
and(x,y) | (x≠0) and (y≠0) のとき真(=1)
xor(x,y) | (x≠0) xor (y≠0) のとき真(=1)

### 配列操作関数

array(a, v1, v2, ...) | 配列 a を残りの引数で初期化する。配列の要素数を返す。
size(a) | 配列 a の要素数
sort(a) | 配列 a を整列する
rsort(a) | 配列 a を逆順に整列する
pop(a, n) | 配列 a から末尾のn要素を取り除く (n = 0 は n = 1 と同義) 。戻り値は操作後の配列の要素数。
push(a,x) | 配列 a の末尾に x を追加する (戻り値は操作後の配列の要素数)
shift(a, n) | 配列 a の先頭のn要素を取り除く (n = 0 は n = 1 と同義) 。残りの要素は前に詰められる。戻り値は操作後の配列の要素数。
unshift(a,x) | 配列 a の先頭に x を挿入する (戻り値は操作後の配列の要素数)
array_sum(a) | 配列 a の要素の和を返す
array_sumsq(a) | 配列 a の要素の自乗和を返す
array_average(a) | 配列 a の要素の平均を返す
array_stdevp(a) | 配列 a の要素の標準偏差を返す
array_stdev(a) | 配列 a の要素の不偏標準偏差を返す
array_max(a) | 配列 a に含まれる最大の値を返す
array_min(a) | 配列 a に含まれる最小の値を返す
array_moving_average(dest, src, n, type) | 配列 src の隣接平均を計算し、配列 dest に格納する。 隣接平均の計算に使われるデータ数を n で指定する (1 の時、前後1つのデータと合わせて3つのデータの平均がとられる)。 type が 0 の時は単純移動平均、1 の時は加重移動平均を計算する。
array_clear(a) | 配列 a の配列の要素数を 0 にする
array_compact(a) | 配列 a の配列の要素から通常の数値以外を取り除き、取り除いた後の要素数を返す
array_copy(dest, src) | 配列 src の各要素を配列 dest に設定する。
map(dest, src, item, ex) | 配列 src の各要素に対して式 ex を計算し、その結果を配列 dest に格納する。第2引数に指定した変数 (item) で配列の要素を参照できる。
reduce(a, item, result, ex) | 配列 a の各要素に対して、 式 ex を実行し、最後に実行した結果を返す。第2引数に指定した変数 (item) で配列の要素を、第3引数に指定した変数 (result) で前回の繰り返 しにおける計算結果を参照できる。
each(a, item, ex) | 配列 a の各要素に対して、式 ex を実行する。第2引数に指定した変数 (item) で配列の要素を参照できる。
each_with_index(a, item, index, ex) | 配列 a の各要素に対して、式 ex を実行する。第2引数に指定した変数 (item) で配列の要素を、第3引数に指定した変数 (index) で繰り返しのカウンタを参照できる。
zip(a1, a2, item1, item2, ex) | 配列 a1, a2 の各要素に対して、式 ex を実行する。第3引数、第4引数に指定した変数 (item1, item2) で配列の要素を参照できる。
zip_map(dest, src1, src2, item1, item2, ex) | 配列 a1, a2 の各要素に対して、式 ex を実行、その結果を配列 dest に格納する。第4引数、第5引数に指定した変数 (item1, item2) で配列の要素を参照できる。
filter(dest, src, item, ex) | 配列 src の各要素に対して式 ex を計算し、その結果が真であった要素を配列 dest に格納する。第3引数に指定した変数 (item) で配列の要素を参照できる。
find(a, item, ex) | 配列 a の各要素に対して式 ex を計算し、その結果が真であった最初の要素を返す。第2引数に指定した変数 (item) で配列の要素を参照できる。
index(a, item, ex) | 配列 a の各要素に対して式 ex を計算し、その結果が真であった最初の要素の位置を返す。第2引数に指定した変数 (item) で配列の要素を参照できる。

### メモリー操作関数

メモリーは全ての数式変換で共有されます。

m(i,x) | 引数を第iメモリーに代入する(i=0〜65535)、i が負のときは末尾からのインデックス (戻り値は x)
rm(i) | 現在の第iメモリーの値(i=0〜65535)、i が負のときは末尾からのインデックス
cm(x,n) | 先頭からn個のメモリーを x で初期化する、n が 0 のときはメモリー全体、n が負のときは末尾から n 個のメモリーを x で初期化する (戻り値は x)
am(a) | 配列 a の内容をメモリーにコピーする (戻り値はコピーした要素数)

### 図形描画関数

図形を描画します。

- 本来のプロットも描画されるので、不要な場合はプロットタイプを mark に、サイズを 0 にすることで、図形のみ描画させることができます。
- 描画される図形は軸のオートスケールには考慮されません。
- 図形の色や線幅・線種はそのデータオブジェクトの設定が使われま す。変えたい場合は COLOR() 関数などを利用します。

draw_rect(x, y, w, h, stroke, fill) | (x, y) と (x + w, y + h) を対角の頂点とする矩形を描画します。stroke, fill が 0 の場合はそれぞれ輪郭、塗りつぶしを描画しません。
draw_arc(x, y, rx, ry, start, stop, pieslice, stroke, fill, close) | (x, y) を中心とし X 方向半径 rx, Y 方向半径 ry の円弧を描画しま す。start, stop で開始角、円弧角を指定します。stroke, fill が 0 の場合はそれぞれ輪郭、塗りつぶしを描画しません。pieslice が 0 以 外の場合は扇形を描画します。close が 0 以外の場合は輪郭を閉じま す。
draw_mark(x, y, size) | (x, y) にマークを描画します。size でマークのサイズを指定できます。 size が 0 のときはデータオブジェクトのサイズ指定が使われます。
draw_line(x1, y1, x2, y2, arrow, size) | (x1, y1) から (x2, y2) に直線を描画します。arrow が 1 のときは終点、 2 の時は始点、3 の時は両端に矢印を描画します。size で矢印の大きさを 指定できます。size が 0 以下の時はデータオブジェクトのサイズ指定が 使われます。
draw_polyline(ax, ay) | 座標 (ax[0], ay[0]), (ax[1], ay[1]), ... を直線で結びます。
draw_polygon(ax, ay, stroke, fill) | 座標 (ax[0], ay[0]), (ax[1], ay[1]), ... で囲まれた領域を描画します。 stroke, fill が 0 の場合はそれぞれ輪郭、塗りつぶしを描画しません。
draw_errorbar(x, y, erx, ery, size) | (x - erx, y) から (x + erx, y) および (x, y - ery) から (x, y + ery) に誤差棒を描画する。size で tick の長さを指定できる。size が 0 のときはデータオブジェクトのサイズ指定が使われる。
draw_errorbar2(x1, y1, x2, y2, size) | (x1, y1) から (x2, y2) に誤差棒を描画する。size で tick の長さを 指定できる。size が 0 のときはデータオブジェクトのサイズ指定が 使われる。
draw_text($str, x, y, dir) | (x, y) に文字列 $str を描画します。dir で方向を指定できます。 制御文字を使用した書式指定が可能です。
draw_text_raw($str, x, y, dir) | (x, y) に文字列 $str を描画します。dir で方向を指定できます。 制御文字は使用できません（そのまま表示されます）。
text_align(x, y) | 文字列を描画するときの位置合わせを指定します。 x は文字列の描画方向、y はそれと直行する方向の位置を0〜1の値で指定します。
text_font(font) | 文字列を描画するときのフォントを指定します。 fontは 0, 1, 2 がそれぞれ Sans-serif, Serif, Monospace に対応します。
text_style(style) | 文字列を描画するときのスタイルを指定します。 style は 0, 1, 2, 3 がそれぞれ normal, bold, italic, bold-italic に対応します。
text_size(pt, space, script) | 文字列を描画するときのフォントサイズなどを指定します。 pt でフォントサイズを指定できます。 続く引数で文字間隔、スクリプトサイズを指定できます。 それぞれ 0 を指定した時は初期値に設定されます。

### 文字列操作関数

string_float($str) | $str を浮動小数点に変換し、その値を返します。
string_float_array(dest, $ary) | 配列 $ary の各要素を浮動小数点に変換し、その値を配列 dest に代入します。 変換された要素数を返します。
string_length($str) | $str に含まれる文字数を返します。UTF-8 以外の文字列では使えません。
puts($str, $format, v1, v2, ...) | 文字列 $str と改行を information window に表示します。正しい UTF-8 文字列の場合、文字列の文字数を返します。
printf($str, $format, v1, v2, ...) | 数値 v1, v2, ... を $format に従って文字列に変換して information window に表示します。正しい UTF-8 文字列の場合、変換された文字列 の文字数を返します。$format の書式は printf(3) に準じます。詳し くは フォント/テキスト - 整形を参照し てください。
sprintf($str, $format, v1, v2, ...) | 数値 v1, v2, ... を $format に従って文字列に変換して $str に代入し ます。正しい UTF-8 文字列の場合、変換された文字列の文字数を返します。 $format の書式は printf(3) に準じます。詳しくは フォント/テキスト - 整形を参照してくだ さい。
string($str, value) | 数値 value を文字列に変換して $str に代入します。value を返します。
string_up($dest, $src) | 文字列 $src に含まれる ascii 文字を大文字にした文字列を $dest に代入します。
string_down($dest, $src) | 文字列 $src に含まれる ascii 文字を小文字にした文字列を $dest に代入します。
string_strip($str) | 文字列 $str の先頭、最後にある空白文字を削除します。
string_append($dest, $src) | 文字列 $dest の最後に文字列 $src を連結します。
string_prepend($dest, $src) | 文字列 $dest の最初に文字列 $src を連結します。
string_insert($dest, $src, pos) | 文字列 $dest の pos 番目の文字の前に文字列 $src を挿入します。
string_reverse($dest, $src) | 文字列 $src の並びを逆にした文字列を $dest に代入します。UTF-8 以外の文字列では使えません。
string_compare($str1, $str2, ignore_case) | 2つの文字列 $str1 と $str2 を比較して $str1 が $str2 に較べて 1)小 さい、2)等しい、3)大きい場合に、ゼロよりも 1)小さい、2)等しい、3)大 きい整数を返します。ignore_case が 0 以外の場合は文字列に含まれる ascii 文字の大文字小文字を区別せずに比較します。
string_match($str, $regexp, ignore_case) | 文字列 $str に対して、文字列 $regexp が表す正規表現によるマッチング を行います。マッチした場合は 0 以外の数値、マッチしなかった場合は 0 を返します。ignore_case が 0 以外の場合は文字列に含まれる ascii 文 字の大文字小文字を区別せずに比較します。
string_truncate($str, len) | 文字列 $str の先頭 len 文字以降を削除します。UTF-8 以外の文字列では使えません。
string_erase($str, pos, len) | 文字列 $str から、pos 文字目から始まる len 文字を削除します。UTF-8 以外の文字列では使えません。
string_join($str, $sep, $ary) | 配列 $ary に含まれる文字列を結合して $str に代入します。各要素の間には $sep が挿入されます。
string_substring($dest, $src, start, end) | 文字列 $src の pos 文字目から始まり end 文字までからなる文字列を $dest に代入します。UTF-8 以外の文字列では使えません。
string_split($dest, $src, $separator, use_regexp) | 文字列 $src を文字列 $separator で分割し、分割された文字列を文字 列の配列 $dest に代入します。use_regexp が 0 以外の場合は $separator を正規表現として解釈します。use_regexp が 2 の場合は $separatorに含まれる ascii 文字の大文字小文字を区別せずに分割しま す。分割された要素数を返します。1つ目の引数に数値の配列を指定した時は 分割された文字列を浮動小数点に変換して配列に代入します。
string_split_float(dest, $src, $separator, use_regexp) | 文字列 $src を文字列 $separator で分割し、分割された文字列を浮動 小数点に変換して配列 dest に代入します。use_regexp が 0 以外の場 合は$separator を正規表現として解釈します。use_regexp が 2 の場合 は$separatorに含まれる ascii 文字の大文字小文字を区別せずに分割し ます。分割された要素数を返します。
string_replace($dest, $src, $regexp, $replacement, ignore_case) | 文字列 $src 中の、文字列 $regexp が表す正規表現にマッチする文字列を $replacement で置換した文字列を $dest に代入します。ignore_case が 0 以外の場合は文字列に含まれる ascii 文字の大文字小文字を区別せずに 比較します。
string_column($dest, index) | データファイルを読み込んだ時に index カラムの文字列を $dest に代入 します。index が 0 のときは行全体の文字列が代入されます。
size($a) | 配列 $a の要素数を返します。
sort($a, ignore_case) | 配列 $a を整列します。ignore_case が0 以外の場合は文字列に含ま れる ascii 文字の大文字小文字を区別せずに比較します。
rsort($a, ignore_case) | 配列 $a を逆順に整列します。ignore_case が0 以外の場合は文字列 に含まれる ascii 文字の大文字小文字を区別せずに比較します。
array_clear($a) | 配列 $a の配列の要素数を 0 にする
pop($a, n) | 配列 $a から末尾のn要素を取り除く (n = 0 は n = 1 と同義) 。戻り値は操作後の配列の要素数。
push($a, $x) | 配列 $a の末尾に $x を追加する (戻り値は操作後の配列の要素数)
shift($a, n) | 配列 $a の先頭のn要素を取り除く (n = 0 は n = 1 と同義) 。残りの要素は前に詰められる。戻り値は操作後の配列の要素数。
unshift($a, $x) | 配列 $a の先頭に $x を挿入する (戻り値は操作後の配列の要素数)
index($a, $item, ex) | 配列 $a の各要素に対して式 ex を計算し、その結果が真であった最初の要素の位置を返す。第2引数に指定した変数 ($item) で配列の要素を参照できる。
filter($dest, $src, $item, ex) | 配列 $src の各要素に対して式 ex を計算し、その結果が真であった要素を配列 $dest に格納する。第3引数に指定した変数 ($item) で配列の要素を参照できる。
array_copy($dest, $src) | 配列 $src の各要素を配列 $dest に設定する。
map(dest, $src, $item, ex) | 配列 $src の各要素に対して式 ex を計算し、その結果を配列 dest に格納する。第2引数に指定した変数 ($item) で配列の要素を参照できる。
reduce($a, $item, result, ex) | 配列 $a の各要素に対して、 式 ex を実行し、最後に実行した結果を返す。第2引数に指定した変数 ($item) で配列の要素を、第3引数に指定した変数 (result) で前回の繰り返 しにおける計算結果を参照できる。

### その他の関数

fit_prm(id,x) | ID が id の data オブジェクトのプロットタイプが fit のとき、対応す る fit object のフィールド "%0x" の値。
fit_calc(id,x) | ID が id の data オブジェクトのプロットタイプが fit のとき、対応する fit 結果 f(x) を計算する。
fit_solve(id,y,x0,x1) | ID が id の data オブジェクトのプロットタイプが fit のとき、対応する fit 結果 f(x) に対して f(x) = y となる x を計算する。x の初期値は x0, x1 で指定する。 x1 が 0 の場合はニュートン法それ以外の場合は二分法で計算する。 正常に計算できなかった場合は UNDEF を返す。
line_number() | 処理中のファイル行番号 (1行目が1)
isnormal(x) | x が通常の数値の場合真
isbreak(x) | x が BREAK の場合真
iscont(x) | x が CONT の場合真
isnan(x) | x が NAN の場合真
isundef(x) | x が UNDEF の場合真
sum(x) | 積算
dif(x) | 差分
f(x,y,z) | ユーザ定義関数
g(x,y,z) | ユーザ定義関数
h(x,y,z) | ユーザ定義関数
color(0,x) | R値を x (0≦x＜256)に設定
color(1,x) | G値を x (0≦x＜256)に設定
color(2,x) | B値を x (0≦x＜256)に設定
color(3,x) | RGB値を x (0≦x＜256)に設定
color(4,x) | R2値を x (0≦x＜256)に設定
color(5,x) | G2値を x (0≦x＜256)に設定
color(6,x) | B2値を x (0≦x＜256)に設定
color(7,x) | R2, G2, B2 値を x (0≦x＜256)に設定
color(8,x) | x を 6 桁の 16 進数として、 2 桁ずつ R, G, B 値に設定
color(9,x) | x を 6 桁の 16 進数として、 2 桁ずつ R2, G2, B2 値に設定
obj_color(id, DATA_OBJ), obj_color(id) | R, G, B, R2, G2, B2 値を ID が id の data オブジェクトと同じ値にする。
obj_color(id, PATH_OBJ) | R, G, B, R2, G2, B2 値を ID が id の path オブジェクトの stroke_R, stroke_G, stroke_B, fill_R, fill_G, fill_B と同じ値にする。
obj_color(id, RECT_OBJ) | R, G, B, R2, G2, B2 値を ID が id の rectangle オブジェクトの stroke_R, stroke_G, stroke_B, fill_R, fill_G, fill_B と同じ値にする。
obj_color(id, ARC_OBJ) | R, G, B, R2, G2, B2 値を ID が id の arc オブジェクトの stroke_R, stroke_G, stroke_B, fill_R, fill_G, fill_B と同じ値にする。
obj_color(id, MARK_OBJ) | R, G, B, R2, G2, B2 値を ID が id の mark オブジェクトと同じ値にする。
obj_color(id, TEXT_OBJ) | R, G, B 値を ID が id の text オブジェクトと同じ値にする。
alpha(x) | A, A2 値を x (0≦x＜256)に設定
alpha(x,1) | A 値を x (0≦x＜256)に設定
ALPHA(x,2) | A2 値を x (0≦x＜256)に設定
obj_alpha(id, DATA_OBJ), OBJ_ALPHA(id) | A, A2 値を ID が id の data オブジェクトと同じ値にする。
obj_alpha(id, PATH_OBJ) | A, A2 値を ID が id の path オブジェクトの stroke_A, fill_A と同じ値にする。
obj_alpha(id, RECT_OBJ) | A, A2 値を ID が id の rectangle オブジェクトの stroke_A, fill_A と同じ値にする。
obj_alpha(id, ARC_OBJ) | A, A2 値を ID が id の arc オブジェクトの stroke_A, fill_A と同じ値にする。
obj_alpha(id, MARK_OBJ) | A, A2 値を ID が id の mark オブジェクトと同じ値にする。
obj_alpha(id, TEXT_OBJ) | A 値を ID が id の text オブジェクトと同じ値にする。
rgb(r,g,b) | 色のRGB値をそれぞれ r, g, b (0≦r,g,b≦1)に設定
rgb2(r,g,b) | R2, G2, B2, の値を r, g, b (0≦r,g,b≦1)に設定
hsb(h,s,b) | 色のHSB値をそれぞれ h, s, b (0≦h,s,b≦1)に設定
hsb2(h,s,b) | R2, G2, B2, の値を、HSB値からそれぞれ h, s, b (0≦h,s,b≦1)に設定
marksize(x) | マークのサイズをXに設定
marktype(x) | マークの種類をXに設定
if(x,ex1,ex2) | x ≠ 0 のとき ex1, x = 0 のとき ex2
unless(x,ex1,ex2) | x ≠ 0 のとき ex2, x = 0 のとき ex1
for(m,begin,end,step,ex) | 第mメモリーの値に begin から end まで step で値を設定し、ex を繰り返 す。m が負の時はメモリーへの設定は行われない。最後に評価された ex の 値を返す。
times(n, index, ex) | ex を n 回繰り返す。第2引数に指定した変数で、繰り返しのカウンタ (0 〜 n-1) を参照できる。最後に評価された ex の値を返す。
getobj($obj, $field, id) | ID が id のオブジェクト $obj のフィールド $field の値を返す。field type が int, bool, enum, double の場合に利用できます。
getobj_string($str, $obj, $field, id) | ID が id のオブジェクト $obj のフィールド $field の値を $str に代入 する。field type が char* の場合に利用できます。正しい UTF-8 文字列 の場合、文字列の文字数を返します。
getobj_array(array, $obj, $field, id) | ID が id のオブジェクト $obj のフィールド $field の値を array に代 入する。field type が char*[], double[], int[] の場合に利用できます。 設定した配列の要素数を返します。
text_obj_get(id, $text) | $text にID が id の text オブジェクトの文字列を設定する。
text_obj_set(id, $text) | ID が id の text オブジェクトの文字列を $text に設定する。
prog1(arg1,arg2,...) | 引数を評価し、最初の引数の値を返す
prog2(arg1,arg2,...) | 引数を評価し、2 番目の引数の値を返す
progn(arg1,arg2,...) | 引数を評価し、最後の引数の値を返す
parameter(id) | ID が id の parameter オブジェクトの設定値を返す
on_end(proc) | 各data オブジェクトの描画終了時に proc を評価する。複数回呼び出すことが可能だが、最後に指定された数式のみが評価される。

## 数式変換の使用例

- ; 使用例

  ; は式の終端を示しますが、さらに続けて別の式を書くことができます。 式の値は一番最後の式の値になります。 例えば、長い式が何度も現れるとき変数への代入と組み合わせて

            a = ...式...;
            ... a ....;

  のようにすれば同じ式は１度書くだけですみます。また式最後の ; は省略できます。

  (従来は式の終端として "=" が使われていましたが version 6.06.10 以降 は ";" を推奨、version 6.08.06 以降は式の終端としての "=" を禁止しています)

- メモリー関数 m(), rm() 使用例

  m() はメモリーへの代入、rm() は読みだしです。全ての数式変換でメモリーは 共有されるため、データ間での値の受け渡しに利用できます。メ モリーは 65536 個 (0〜65535) まで利用できます。また、未使用のメモリーは 0 に初期化されています。

- 比較関数 eq(), neq(), lt(), gt(), le(), ge() 使用例

  数値の比較を行う関数ですが、下記の例のように浮動小数点誤差により 思った通りの結果が得られない場合があります。

            Ngraph$ iexpr 'eq(0.5 - 0.4, 0.1)'
            0

  このような場合に、3番目の引数で比較の桁数を指定すると期待する結果 が得られることが多くなります。

            Ngraph$ iexpr 'eq(0.5 - 0.4, 0.1, 14)'
            1

  計算によっては浮動小数点誤差の影響が大きくなる場合もありますので注 意が必要です。

- 関数 dif() 使用例
  関数 dif() は微分でなく差分を返す関数です。 現在のデータがデータ中 n 番目としそれを y(n) で表すとすると

  dif(y)=y(n) - y(n-1)

  です。これを用い簡単に微分近似値を求めるには

            dif(y)/dif(x)

  とします。

  dif(y)/dif(x)は {y(n)-y(n-1)} / {x(n)-x(n-1)} になります。

  この時、Xの変換数式を

            x-dif(x)*0.5

  としてXを"現在のデータと一つ前のデータの中間値"としておいた方がより真に近いグラフが得られると思われます。

  X変換式: x-dif(x)*0.5 (これは { x(n-1)+x(n) }*0.5 になります)
  Y変換式: dif(y)/dif(x) (これは { y(n)-y(n-1) } / { x(n)-x(n-1) } になります)

  dif() は現在のデータと一つ前のデータとの差分を返しますから、y-dif(y) とすることで一つ前のデータを取り出すことができます。 同様に y-dif(y)-dif(y-dif(y)) で2つ前のデータを取り出すことができます。 y-dif(y)-dif(y-dif(y))-dif(y-dif(y)-dif(y-dif(y)))は3つ前のデータです．

  一番初めの dif() の戻り値は"不定"です．このため，式全体の値も"不定"となり、結果としてデータの個数は1つ減ります(一番初めのデータに差分は存在しない)。 また dif() をいくつも含む式では、全ての dif() が初期化されるまで式全体の値は"不定"です。 例えば dif() をネストして dif(dif()) のように使った場合、一番初めのデータでは内側の dif() が初期化されその戻り値は不定の為、外側の dif() の初期化は行われません。 外側の dif() が初期化されるのは 2番目のデータの時です。 従ってデータの個数は2つ減ることになります。

- 関数 sum() 使用例
  関数 sum() は積算を返す関数です。 現在のデータが n 番目としそれを Y(n) で表すとすると

  sum(y)=Σ y(n) (n=1..n)

  これを用い簡単に積分近似値を求めるには

            sum(y*dif(x))

  とします。

  sum(y * dif(x)) は Σ y(n) * {x(n) - x(n-1)} (n = 1..n) になります。

  また、台形公式を用いて積分近似値を評価したい場合

            sum(0.5 * (2 * y - dif(y)) * dif(x))

  とします。

  sum(0.5 * (2 * y - dif(y)) * dif(x)) は Σ(y(n-1) + y(n)) / 2 *{x(n) - x(n-1)} (n = 1..n) になります。

  さらに積分の上限(b)、下限(a)を指定したい場合は階段関数 theta() を用い

            sum(0.5 * (2 * y-dif(y)) * dif(x) * theta(x-a) * theta(b-x))

  とします。if() を使って

            if(x >= a && x <= b, sum(0.5 * (2 * y - dif(y)) * dif(x)), 0)

  としても可能です。
- 関数 if() 使用例
  if(x,ex1,ex2) は x が真(<>0)のとき ex1 を，偽(=0)のとき ex2 を返す関数です。例えば次の式

            if( x < 0, 0, sqrt(x) )

  は x<0 のとき 0、x>=0 のとき√x を返す関数になります。また必ず ex1, ex2 どちらか一方しか評価されません。
- 関数 marksize(), color() 使用例
  marksize()、color()関数は数学関数では無く、それぞれプロットされたマークのサイズ、色を指定する関数です。 例えば、(x,y,z) の 3 カラムから成るデータがあり、マークのサイズを z の値で変更したいような場合には

            marksize(%03)

  とします。ただこれですと、プロットされるデータも %03 となりますので、前述の ; を使って

            marksize(%03);
            y

  とするのが正しい使い方です。 color()関数も同様で

            color(3, %03);
            y

  のように使います。
- 関数 obj_color() 使用例

  data, path, rectangle, arc, mark, text の各オブジェクトの設定色を描 画色にします。例えばいくつかのフィッティング結果をもとにフィッティ ングパラメータをグラフにするような場合、

            obj_color(x);
            fit_prm(x,1)

  のようにして、フィッティングとプロットの色を揃えることができます。 この時 x はフィッティングプロットにした data オブジェクトのインスタ ンス ID です。
- 関数 fit_prm(), fit_calc() 使用例

  フィッティングの結果からそのパラメータや、フィッティング式の計算を 行う関数です。

  例えば、いくつかの１次フィットからその傾きをプロットしたい場合、

            fit_prm(x,1)

  のようにします。この時 x はフィッティングプロットにした data オブジェ クトのインスタンス ID です。

  また、１次ドリフトのあるデータからドリフト成分を引いてプロットし たい場合 (id が 0 の data オブジェクトでフィッティングを行ってい るとして)、

            y-fit_calc(0,X)

  のようにします。

  これらの関数はフィッティングの結果が確定していないと計算に失敗しま す。データの描画順に注意してください。また、初回のプロットでオー トスケールに反映されないことがあります。

- ブロック使用例

  ブロックは if(), unless(), for() などの関数の引数に使用して複数 の式を評価するために利用できます。下記の例では x の値が 1 以上変 化する毎に y の平均値を計算しています (x は1 よりも大きいことを 仮定) 。

              if(x - a < 1,
                {
                  b += y;
                  n += 1;
                  CONT;
                },
                {
                  r = if(n, b / n, CONT);
                  b = y;
                  n = 1;
                  a = x;
                  r;
                })

- 関数 prog1(), prog2(), progn() 使用例

  関数 prog1(), prog1(), progn() は複数の引数を評価して、最初、2番 目または最後の引数の値を返す関数です。if(), unless(), for() など の関数の引数に使用して複数の式を評価するために利用できます。下記 の例では x の値が 1 以上変化する毎に y の平均値を計算しています (x は1 よりも大きいことを仮定) 。

            if(x - a < 1, progn(b += y, n += 1, CONT), prog1(if(n, b / n, CONT), b := y, n := 1, a := x))

- 図形描画関数の使用例

  データから円や矩形を描画できます。例えば、以下のようなデータから 円グラフを作成することができます。

  データ

           1
           2
           3
           4

  変換式

         hsb2(%0/NUM,1,1); x*=360/SUMX; draw_arc(0,0,1,1,sum(x),-x,1,1,1,1)

  hsb2() 関数で塗りつぶしの色を変えながら draw_arc() 関数で扇形を描 画します。

- parameter 関数の使用例

  parameter object を作成すると、そのパラメータの値を parameter 関数で参照できます。 データの設定を変更せずに条件を変えてプロットすることができます。