|
2.6.7 反復関数における評価
反復操作を行うTable,Sum,Plot,Plot3D等の組込み関数において,引数評価は多少特別の扱いを受ける.
Table[f, i, imax ]等の評価で取られる最初のステップでは,大域変数iの保存,そして,局所的な反復変数iの設置が行われる(2.7.6を参照のこと).次に,反復回数の上限imaxが評価される.f は,iの値が確定するまで未評価なまま保持される.いったん,反復操作を開始し,iに値が割り当てられると,fの評価を開始する.そして,iの各値において,f は評価される.最後に,反復評価がすべて終了したとき,変数iにはもとの大域値が戻される.
乱数生成関数を4回実行する.毎回,別の擬似乱数が生成される.
In[1]:= Table[Random[ ], {4}]
Out[1]= 
Tableを作用させる前にRandom[ ]を評価しておく.すると,同じ値が4回出力されるだけになる.
In[2]:= Table[ Evaluate[Random[ ]], {4} ]
Out[2]= 
Table[f, i, imax ]のような反復式では,普通,iに特定の値が割り当てられるまでは関数f は未評価な形のままにしておいた方がよい.任意の値を持つiに対して有効となる関数fの完全なシンボル形式が見付からないときは特にそうである.
引数が整数なら,階乗を計算し,そうでない場合はNaNを返す関数を定義し,facと呼ぶ.(注 : NaNは,英語で数でないという意味の"Not a Number"の略)
In[3]:= fac[n_Integer] := n! ; fac[x_] := NaN
iに整数が割り当てられるまで,fac[i]は評価されない.
In[4]:= Table[fac[i], {i, 5}]
Out[4]= 
Evaluateを使い,iがシンボル的なオブジェクトであってもfac[i]を強制評価させる.
In[5]:= Table[Evaluate[fac[i]], {i, 5}]
Out[5]= 
Table[f, i, imax ]のような式において,f を,任意なiを持つ関数として完全なシンボル形式で記述することが可能であれば,このシンボル形式をまず計算してしまい,その後にTableを作用させた方が計算の効率が上がる.これを行うには,Table[Evaluate[f], i, imax ]を使う.
iに新たな値が割り当てられるたびにSum式は評価される.
In[6]:= Table[Sum[i^k, {k, 4}], {i, 8}]
Out[6]= 
実は,この和に相当するシンボル形式の論理式を得ることができる.それは,iがどんな値であっても有効である.
In[7]:= Sum[i^k, {k, 4}]
Out[7]= 
Evaluateを挿入しておくことで,Mathematicaにまず和をシンボル的に評価させ,次に,i上で反復させる.
In[8]:= Table[Evaluate[Sum[i^k, {k, 4}]], {i, 8}]
Out[8]= 

反復関数における評価
1.9.1でも説明したが,単一の関数や複数の関数を一度にプロットするときは,Evaluateの強制評価機能を使うと効率が上がる.強制的に評価させると,まず,関数に対応した式がシンボル形式で生成され,その後に,反復処理が実行される.
|