Mathematicaプログラミング
■ 式の書き換え
「x^2+2x+3」のxが5の時の値を求める方法として単純に考えると 以下のようになる。
In[1]:= x=5 Out[1]= 5 In[2]:= x^2+2x+3 Out[2]= 38
しかし、この方法ではxに値を割り当ててしまうために、 元の値を上書きしてしまう上に、 これ以降のxはすべて5として計算されてしまう。
そこで、以下のようにするとこれらの問題が解決できる。
In[1]:= x^2+2x+3 /. x->5 Out[1]= 38
この様に「/.」を使用することで 式を書き換えることができるために、 シンボルの割り当てをいじらずに値を求めることができる。
ReplaceAll (/.)
式 /. ルール
とすることによって、式をルールによって書き換えることが可能である。
なお、ルールをリストにして与えることで 複数のルールが一度に適用可能である。
In[1]:= {a, b, c, b} /. b->x Out[1]= {a, x, c, x} n[2]:= {o, p, q, r} /. {p -> x, r -> y} Out[2]= {o, x, q, y}
ReplaceRepeated (//.)
ReplaceAllとは違い、 式をこれ以上変換することが出来なくなるまでルールの適用をおこなう。
In[1]:= {a,b,c} /. {a->b, b->x} Out[1]= {b, x, c} In[2]:= {a,b,c} //. {a->b, b->x} Out[2]= {x, x, c}
Rule (->)
「lhs -> rhs」のように書き、 lhsにはパターンを用いることが出来る。
In[1]:= {a^b, b^c, c^a} /. a^x_ -> f[x] Out[1]= {f[b], b^c , c^a }
RuleDelayed (:>)
「lhs :> rhs」のように書き、パターンが適用される度に評価される。
In[1]:= {a, b, c, a} /. a -> Random[] Out[1]= {0.249516, b, c, 0.249516} In[2]:= {a, b, c, a} /. a:> Random[] Out[2]= {0.137118, b, c, 0.559063}
「->」では割り当てられるランダムな値が同一なのに対し、 「:>」では異なっている事が分かる。