Mapについて

昔、Mathematicaを使い始めたときMapって何?とか思った
ドキュメントセンター見ても写像という言葉がないのはなんでなのかな、と変に悩んだり
まあ、Mapは写像なんだけどね
というわけで、ちょっと解説っぽいものを

入力
Map[f, {a, b, c, d, e}]
(*Map[f[#]&,{a, b, c, d, e}]と同じ、また、簡略形だとf /@ {a, b, c, d, e}*)
出力
{f[a], f[b], f[c], f[d], f[e]}

#は入れるところが1つしかなかったら省略可能でそのときは&もいらない
こういう簡略に記述したものと普通に記述したものが併用されるから初心者が分かりにくいんだろうな
この場合のfというのはGraphics関連の関数でもよくて、SphereとかCylinderとかCuboidとかでも適用できる
たとえば、こういうことも出来る

入力
randomlist[n_] := RandomReal[{0, 1}, {n, 3}]
rlist = randomlist[1000];
RGBColorList[{r_, g_, b_}] := RGBColor[r, g, b]
Graphics3D[{Map[{RGBColorList[#], Sphere[#, 0.05]} &, rlist]}]
出力

ちょっと丁寧に説明すると、randomlist[n]のRandomReal(これはver.6以降)は、0から1の範囲の実数値をランダムに取り出して、n×3の行列を作るということ
この場合、Sphereの点の中心座標は3次元座標だから3列、n列というのは作りたい球の個数になる
今回は、{A,B,C}という形をランダムに作ってMapに作用させてみようということ
で、rlistは1000個も代入するものを作っちゃってるということ
(rlistと置いたのは、randomlist[1000]にすると実行するごとに値が変化するのため、それを防ぐため 今回は別に防ぐ必要は特にない)
なんとなく色を変えたかったので、RGBColorで色をかえてみた
RGBColorは、ちょうど3つの引数をとるのだけど、残念なことにRGBColor[A,B,C](3つとも0~1の値)という形なので、
RGBColorListというものを勝手に定義してRGBColorList[{A,B,C}]が呼ばれたらRGBColor[A,B,C]に変換されるようにした
(RGBColor[#[ [1] ],#[ [2] ],#[ [3] ] ]でもいいんだけどね…)
Mapの中の#は、その場所に入れますよということを示している
&というのは、おまじないみたいなもの(ちゃんと書くと、純関数のFunctionを簡略化したもの)
真面目に書けばGraphics3D[{Map[Function[{RGBColorList[#], Sphere[#, 0.05]}], rlist]}]になる
全部を簡略化したら、Graphics3D[{{RGBColorList[#], Sphere[#, 0.05]} & /@ rlist}]だけど、
Map[~]まで簡略化すると、クリックしにくいので私はMapは簡略化せずに使ってる
(上で愚痴ったのに併用してる!)
注意点としては、今回は純関数(無名関数)をリストに作用させたがMapで使うための関数が多変数になるときは、fn[{x1_,x2_,x3_,...}]:=~という形でfnに代入するものをリスト化しましょうという点
じゃないと上のRGBColorのように面倒なことになってしまうし、Mapを使う時点でrlistの箇所はリスト化しないといけないから、それなら予め関数の方を合わせておきましょうということ


■余談
Opacityを付け加えたらやたら処理に時間がかかった…

というか、これ書くのに時間がかかりすぎて、これとは関係ない作業が全然進まなかった…