このたびの大震災で被災された方々を思うと、胸が苦しい。亡くなられた方々の冥福を祈ります。祈ること以外でインドア非力野郎の僕にできるのは、募金、そして、この記事を、いつも通りに書くこと。

今回は Mathematica 8 の繰り返しについて。以前にも書いたように、Mathematica 言語では、繰り返しや条件分岐など制御構造と呼ばれるようなものも、すべて関数(というか式)の形で書く。繰り返しなら Do[〜] や While[〜] といった形だ。あまりにも基本的なこれらの関数が、ver.4 以降でも追加・変更されていることを知って、僕はとても驚いた。

まずは Do 関数について。
ver.6 以降、Do では、次の形式が使えるようになった。

Do[〜, {elem, <list>}]

これは、Perl や PHP の foreach やに相当するもので、<list> の各要素を順番に elem に割り当てて 〜 の部分を実行してくれる。例えば、リスト myList の内容を Do を使って順番に Print するとき、以前のバージョンだと

Do[
  Print[myList[[i]]];
, {i, Length[myList]}]

といった風に書くのが常套だったし、今でもこの書き方はもちろん有効。ただ、 i の値がリストの要素を指し示すだけで処理そのものに関係ないこのようなケースであれば、今なら次のように書くのがオススメ。

Do[
  Print[e];
, {e, myList}]

上の <list> の部分は、もちろん { } を使って書き下しても良いし、リストの中身は何でも構わない。例えば、ある数値 x の Sin, Cos, Tan を計算した結果を Print するなら、こういう風に書ける。

Do[
  Print[f[x]];
, {f, {Sin, Cos, Tan}}]

この Do と同様の拡張は、Table 関数でも行なわれており、上の「ある数値 x の Sin, Cos, Tan を計算した結果」を Print するのではなくまとめてリストにするのであれば、

Table[f[x], {f, {Sin, Cos, Tan}}]

とすれば OK だ(もちろん Through[{Sin, Cos, Tan}[x]] や Map[#[x] &, {Sin, Cos, Tan}] でも同じ結果を得られる)。

次は While 系の関数群について。
While 系の関数には、LengthWhile, NestWhile, NestWhileList, TakeWhile, While の5つがあるが、このうち While を除く4つは、ver.4 以降で追加された関数だ。それぞれの例はリンク先のヘルプにいろいろ載っていて、なるほど便利かもと思わされる。
前回の Twitter API 記事にも、NestWhileList を使っている部分があるので、興味のある人は参照されたい。

変更点はないかもしれないが、ForNest, FixedPoint などの古くからそのままの仕様の繰り返し関数もあるし、Table, Sum, Product, Map、さらに CasesSelect だって繰り返し処理の関数と言えなくもない。
そっか。繰り返しを簡潔に書くための工夫が、Mathematica には内蔵関数の形でたくさん用意されてるってことなんだな。納得納得。

※この記事の内容は執筆者の個人的見解で、ヒューリンクスによる公式情報ではありません。[免責事項]

トラックバック

この記事へのトラックバックURL
http://blog.hulinks.co.jp/cgi/mt/mt-tb.cgi/464
内容に対しての関連性がみられないものは削除する場合があります

Mathematica の繰り返しがおもしろかったので,ちょっと関連する話をしてみようと思います. 結論から言うと,「繰り返しのコードを書いたら負け」とい... 続きを読む

「Mathematica では繰り返しのコードを書いたら負け」とは、以前の記事に... 続きを読む

コメントの投稿

Emailアドレスは表示されません。は必須項目です。
ヒューリンクス取り扱い製品の内容や購入に関するお問い合わせはヒューリンクスサイト連絡先へお願いいたします。投稿前にその他の注意事項もご覧ください。

HULINKS サイトの新着情報