Mathematicaのつまずきポイントのひとつである記号についての解説です。
記号は大抵の場合、関数のショートハンド的な扱いなので、全部関数を使って表現してもいいのですが、
コードを読めるようになってくると記号の方が解りやすかったりもします。
以下の文献も参考にしてください。
Wolfram言語のシンタックス—Wolfram言語ドキュメント
それではいきます。
Map
/@
リストの要素それぞれに関数を適用します。
In[1]:= Map[f, {a, b, c, d, e}]
Out[1]= {f[a], f[b], f[c], f[d], f[e]}
Mapの省略表記が/@
です。
けっこうよく使います。
In[1]:= f /@ {a, b, c, d, e}
Out[1]= {f[a], f[b], f[c], f[d], f[e]}
Apply
@@
頭部を別のものに置き換えます。
In[1]:= f @@ {a, b, c, d}
Out[1]= f[a, b, c, d]
以下でFullForm
して分かる通り、{a, b, c, d}
の頭部はList
なので、頭部List
がf
にすげ替えられます。
In[1]:= FullForm[{a, b, c, d}]
Out[1]= List[a, b, c, d]
@@
はApplyの省略表記です。
In[1]:= Apply[f, {a, b, c, d}]
Out[1]= f[a, b, c, d]
逆に、関数の引数をリスト化することもできます。
In[1]:= List @@ f[a, b, c, d]
Out[1]= {a, b, c, d}
@@@
というのもありますが、これもApplyのとある表現方法です。
接頭辞関数の適用
f @ x
は
f[x]
と同じです。オプション等のない1引数の関数のときに簡単に書けます。
例:
Graphics@Circle[{5, 3}, 8]
特に知ってなくても困りませんが、閉じ括弧が要らないのでさくっと検証するときとかに便利です。
これはApplyのように関数名として何か割り当てられてるのだったかどうか…。( []
の代わりってだけですかね?)
接尾辞関数の適用
x // f
は
f[x]
と同じです。
Sin[x]^2 + Cos[x]^2 // FullSimplify
みたいに、一旦書き上がった式に関数を適用するときに便利です。
これも括弧を意識しなくていいので、さくっと検証するときはよく使います。
Slot
#&
純関数です。
#&[5]
は入力5をそのまま返します。
(#+3)&[5]
は入力5に3を足した値を返します。
関数定義の手間が省けます。
Selectのように、関数を条件として渡すときなどに純関数で書くことが多いです。
In[1]:= Select[{1, 2, 4, 7, 6, 2}, # > 2 &]
Out[1]= {4, 7, 6}
これが理解できたら、Mathematicaプログラミングで一皮むけた実感がわきます。
Out
%
直前の結果を参照します。
ただし、
5 + 3 I
Re[%]
Im[%%]
のように、1行増える毎に遡る量を調整しなければいけないので使いづらいケースもあります。
これもさくっと検証する時によく使いますが、ミスの元になりやすいので注意して使いましょう。
SetDelayed
:=
「遅延評価」というMathematicaの重要な概念に関係します。
最初のうちは「関数を定義するときに使う」くらいの認識で大丈夫です。
例えば引数に1を足して遅延評価する(関数を定義する)には以下のように書きます。
f[x_] := x + 1
Blank
_
これも「パターン」というMathematicaの重要な概念に関係します。
最初のうちは「関数に引数を指定するときに使う」くらいの認識で大丈夫です。
さっきと同じコードですが、例えば引数に1を足す関数で、引数をxというパターンとして設定するときは以下のように書きます。
f[x_] := x + 1
他にパターンを扱う記号として __
と ___
もあります。 Cases を駆使するときなどに悪戦苦闘することになると思います。
Rule
->
左のパターンを右のパターンに置き換える、という書き方ができます。
僕が大好きなシェルピンスキーのカーペットはこんなふうにすれば書けます。もはや体で覚えてます。
Nest[ArrayFlatten[# /. {
1 -> {{1, 1, 1}, {1, 0, 1}, {1, 1, 1}},
0 -> {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}
}] &, 1, 3]
ちなみに、使い方が悪いのかもしれませんが、トリッキーな書き方をしていると思い通りに効かない時があります(個人の感想です)。
また、別の使い方として、連想配列を作るときなど、割といろいろなところで登場します。
「左の式が右の式と対応している」的なニュアンスでしょうか。
<|a -> x, b -> y, c -> z|>
ReplaceAll
/.
先ほど紹介したシェルピンスキーのカーペットの例で示した通り、左の式を右の規則で置き換える、というときに使います。
Replace と似ていますが、記号化されているからということもあり、ReplaceAllの方が頻繁に使われます。
StringJoin
<>
文字列を結合します。JavaScriptでいう +
なんですが、加算と区別するためか、ちょっと不自然な記号という印象はあります。
In[1] := "Pen" <> "Pineapple" <> "Apple" <> "Pen"
Out[1] := "PenPineappleApplePen"
Condition
/;
個人的にはあまり使わないのですが、条件を指定して評価することができます。
実は他にもまだまだあります。
一般的にプログラミングにおいて記号を覚えるのは大変ですが、記号を制するものはMathematicaを制する、と言っても過言ではないと思ってます。
皆さんも記号の使い方をマスターして一皮剥けましょう!