Mathematica

スティーブン・ウルフラムが考案し広く使われている数式処理システム ウィキペディアから

Mathematica

Mathematica(マセマティカ)は、スティーブン・ウルフラムが考案し広く使われている数式処理システムウルフラム・リサーチの、ウルフラムが率いる数学者プログラマのチームが開発し、同社(正規認定販売代理店)により販売されている。Mathematicaは項書き換えを基本として、複数のパラダイムをエミュレートするプログラミング言語( Wolfram言語という)としても強力である。

概要 開発元, 初版 ...
Wolfram Mathematica
Thumb
Mathematica 8.0.0 GNU/Linux版のフロントエンド
開発元 ウルフラム・リサーチ
初版 1988年6月23日[1]
最新版
14.2 / 2025年1月23日 (2か月前) (2025-01-23)
プログラミング
言語
C/C++JavaWolfram
プラットフォーム クロスプラットフォーム (list)
対応言語 英語日本語中国語フランス語ドイツ語イタリア語韓国語スペイン語
種別 数式処理システム数値解析、情報視覚化、統計処理、ユーザインタフェース生成
ライセンス プロプライエタリ
公式サイト www.wolfram.com/mathematica/
テンプレートを表示
閉じる

カテゴリ / テンプレート

概要

ウルフラム・リサーチの創始者であるスティーブン・ウルフラムと彼のチームは、1986年から新たな数式処理システムの開発を開始し、1988年にその最初のバージョンをリリースした。ウルフラムは当初、このシステムをOmega、のちにPolyMathと呼んでいたが、当時NeXT社の社長であったスティーブ・ジョブズに相談したところ「ダサい名前だ」と一蹴され、なにか一般的な語をロマンチックに表現したもの、例えばトリニトロンのような名前が良いとして「Mathematica」と名付けた[2]

歴代のMathematicaのロゴに使われているのは「スパイキー」と呼ばれる三次元多面体で、初代 Mathematicaでは大二十面体、それ以降のバージョンでは双曲二十面体を装飾したものが使われている[3][4]

プログラミング言語としてのMathematicaは、項書き換えを基本として関数型手続き型の両方をサポートするマルチパラダイム・プログラミング言語である。Mathematicaは、ウルフラムらが1979年頃に開発した Symbolic Manipulation Program を起源とし[5]プログラミング言語ALGOLLISPAPL、および数式処理システムMacsymaの影響を受けている[6][7]

MathematicaはC/C++およびJavaで実装されているが、拡張可能なライブラリはすべてWolfram言語で書かれている。実際、新しいコード(Wolfram言語で書かれたテキストファイル)はMathematicaの「パッケージ(.mファイル)」として追加される。Mathematicaには4,000以上の高度に洗練された組み込み関数が用意されており[8]、それらをビルディング・ブロックとして組み合わせていくことで、簡単にプログラムを作ることができる。

システムとしてのMathematicaは、Wolfram言語を解釈し実際に計算を実行する「カーネル」と、その計算結果を表示する「フロントエンド」の2つの部分から構成される。カーネルとフロントエンドの間の通信には「MathLink[リンク切れ]」プロトコルが使われる。

Mathematicaの最新バージョンは 14.1(2024年7月31日リリース)で、様々なコンピュータシステム上で利用可能となっている。

機能

Thumb
調整可能なパラメータで描画したディニの曲面英語版

Mathematicaには次のような機能がある[9]

インタフェース

システムとしてのMathematicaは、ユーザーとの対話を行う「フロントエンド」と、演算を実行する「カーネル」の2つの部分から構成される。フロントエンドはMathematicaシステムのGUIを担当する部分で、自動構文カラーリング、入力補完、デバッガなどの開発ツールの機能がある。また、一般的なワードプロセッシング機能の大部分もサポートしている。

フロントエンドとカーネルは互いに独立に起動し、「MathLink[リンク切れ]」と呼ばれるプロトコルを使って通信している。実際、Mathematicaを起動した時点ではカーネルは起動しておらず、フロントエンドで最初の計算が実行された時にはじめてカーネルが起ち上がる。

ノートブック

Mathematicaの標準的なフロントエンドである「ノートブック」は対話型のドキュメントで、データ・数式・テキスト・コード・演算結果・グラフィックス・表・GUIコンポーネント・アニメーション・音声などを混在させることができる。ノートブックはウルフラム・リサーチの共同創始者であるセオドア・グレイ英語版によって設計され、Mathematica 2.0より採用された。

一つのノートブックの中でデータの処理から可視化、さらに文書作成までをシームレスに行えることが、Mathematicaの最大の利点の一つである。ノートブックにおいては、ユーザーの入力(テキストと Wolframコード)やカーネルの演算結果(グラフィックやサウンドも含む)は、すべて階層化された「セル」に納められ、文書のアウトライン化やセクション分割が容易に行える。

ノートブックの中身はすべてWolfram言語で記述されており、それ自体を Wolfram 言語で生成・修正・解析することが可能である。ノートブックからTeXやXMLなどの他のフォーマットへの変換は、この機能を用いた構文解析を通じて実現されている。

代替フロントエンド

Mathematica標準のノートブック以外にも、代替のフロントエンドが存在する。2006年にはEclipseベースのIDEWolfram Workbenchが登場した。プロジェクトベースのコード開発ツールとなっており、リビジョン管理、デバッグ、プロファイル、評価などの機能がある。またMathematicaには、テキスト型インタフェースが同梱されており、UNIXコマンドラインから直接カーネルを呼び出し対話することも可能である[10]

計算可能なデータ

Thumb
Mathematicaで利用できるリアルタイム気象データを用いた流線プロット (StreamPlot) の例。

Mathematicaには一貫したフレームワークで管理されたデータ群が含まれており、即座に計算に使用できる。それらデータはモデル評価などの目的でプログラムから使用でき、ウルフラム・リサーチにあるデータサーバに自動アクセスして最新データに更新できる[11]。株価や気象などのデータはリアルタイムに配信される。

計算可能なデータには次のようなものがある。

  • 数学データ: 195の多面体の98種類の属性データ、5300のグラフの282種類の属性データ、6つの結び目の64種類の属性データ、21の格子の38種類の属性データ
  • 化学データ: 44,000 の化合物の101種類の属性データ、118の元素の86種類の属性データ、1000の亜原子粒子の35種類の属性データ、3200の同位体の33種類の属性データ
  • 天文学データ: 52の測地座標系の32種類の属性データ、156,000 の天体の99種類の属性データ
  • 地政学データ: 240カ国の223種類の属性データ、164,000の世界各地の都市の14種類の属性データ
  • 言語データ: 149,000の英単語の37種類の属性データ、他の26の言語の辞書
  • 生命科学データ: 40,000のヒト遺伝子の41種類の属性データ、27,000のタンパク質の30種類の属性データ
  • 金融データ: 146,000の銘柄や金融商品の74の属性データ(履歴とリアルタイム)
  • 気象データ: 22,000の世界各地の観測地点における43の属性データ(履歴とリアルタイム)
  • Wolfram Alphaのデータ: Wolfram Alphaからの兆を越える多数のデータ

高性能計算

1999年のバージョン4でパックアレー[12]、2003年のバージョン5で疎行列を導入し[13]GNU Multi-Precision Library を採用して高精度演算が可能となり、高性能計算向け機能が拡張された。

バージョン5.2 (2005) では、マルチコアコンピュータ上で動作する際に自動的にマルチスレッド化する機能を追加した[14]。このバージョンから CPU 毎に最適化されたライブラリを採用している。また、ClearSpeed英語版 などのサードパーティ製高速化ハードウェアが Mathematica をサポートしている[15]

2002年、異機種混在型クラスターやマルチプロセッサシステムでのユーザレベルの並列計算を可能にするgridMathematica英語版をリリース[16]。2008年には、並列計算技術は通常の Mathematica ライセンスに含まれるようになり、Windows HPC Server 2008Microsoft Compute Cluster ServerSun Grid をサポートするようになった。

2010年からCUDAおよびOpenCL対応のGPUハードウェアをサポート。またバージョン8ではC言語コードを生成でき、Intel C++ CompilerVisual Studio 2010のコンパイラで動的にコンパイルできる。

他のアプリケーションとの接続

要約
視点

MathLink[リンク切れ]プロトコルは、Mathematicaのカーネルとフロントエンド間の通信だけでなく、任意のアプリケーションとカーネルとの通信にも使われる。Mathematicaは豊富な機能を備えているが、他のプログラムの機能を利用したり、古いコードにアクセスするためにいくつかのインタフェースが開発されてきた。

C、Java、.NET、データベース、Rとの接続

ウルフラム・リサーチはMathematicaカーネルとのMathLinkによる通信を行うアプリケーション開発者向けにC言語での開発キットを無料で配布している[17]

J/Link.NET/Linkは、それぞれMathLinkをベースにしたJavaおよび.NET用のコンポーネントである。J/Link を使うと、JavaプログラムからMathematicaに計算を依頼することができ、MathematicaプログラムがJavaのクラスをロードし、Javaオブジェクトを操作したりメソッドを呼び出したりできる。そうすると、例えばMathematicaから Java の GUIを構築できる。同様に、.NET/Linkを使えば.NETプログラムと同様のことが可能になる。

DatabaseLinkSQLデータベースを扱うためのツールキットで、JDBC接続とODBC接続をサポートしている。RLinkは統計解析向けプログラミング言語Rと交信し Mathematica内からRのコードを実行するもので、バージョン9から正式にサポートされた。

その他の接続

その他にMathematicaと接続できるプログラミング言語としては、Haskell[18]AppleScript[19]Racket[20]Visual Basic[21]Python[22]Clojure[23]がある。数学関係のソフトウェアでは、OpenOffice.org Calc[24][リンク切れ]Microsoft Excel[25]MATLAB[26][27][28]SINGULAR[29]Origin[30]に接続可能である。

Mathematicaはリアルタイムのデータストリームを受け付けることもでき、LabVIEW[31]、金融関係用[32][リンク切れ]、GPIB (IEEE 488)[33]USB[34]、シリアル接続[35]などの方法がある。HIDデバイスからの入力を自動的に検出して読み込むこともできる。最近ではLEGO マインドストームで作ったロボットをBluetooth通信を介して操作する試みもなされている[36]

2014年1月6日、ウルフラム・リサーチは、Wolfram言語と外部装置の接続利用促進に向けたプロジェクトWolfram Connected Devices Projectを起ち上げた[37][38]

アプリケーション配布

Mathematicaで書かれたアプリケーションを配布するための手段がいくつか用意されている。

  • Wolfram CDF Player
    • 計算可能ドキュメント形式 (CDF) でセーブされ Mathematicaプログラムを実行できる無料のプレイヤーである。
    • 代表的なウェブブラウザへのプラグインも含まれている。
    • Mathematicaの標準形式のファイルも閲覧可能だが、実行はできない。
  • Wolfram Player Pro
    • Mathematicaのアプリケーションを実行可能なランタイム版Mathematicaである。
    • コードの作成・編集はできない。
  • webMathematica
    • ウェブブラウザがリモートのMathematicaサーバのフロントエンドとして機能できるようにする。
    • ユーザーの書いたアプリケーションにブラウザ経由で任意のプラットフォームからアクセスすることを可能にする。
    • Mathematicaへの完全なアクセスを提供することはできない。

MathematicaのコードはC言語のコードに変換したり、DLL を自動生成することも可能である。また、閲覧に限ったファイルの共有にはHTMLやLaTeX書式での出力が便利である。数式はMathMLに変換することで他のソフトウェアとやりとりできる。

対応プラットフォームとライセンス

Mathematicaは、Microsoft WindowsmacOSLinuxの各種バージョンおよびクラウドで動作する[39]。どのプラットフォームも64ビット版をサポートしている。過去にサポートしていたOSとしては、NeXTSTEPSolarisAIXConvexHP-UXIRIXMS-DOSOS/2UltrixWindows MeWindows XPなどがある。

ライセンス

Mathematicaはプロプライエタリなシステムである。政府機関、非営利組織、教育機関、学生、家庭用に向けては低価格を設定している。例えば、学生向けの製品(内容は正規品と同じ)は正規価格の5%程度で購入できる。教育機関向けライセンスで契約した場合、学生は家庭でもMathematicaを利用可能である。指定された数の Mathematica をネットワーク上で同時に起動できるネットワークライセンスも用意されている。

Mathematicaの価格設定は地域によっても大きく異なる。日米での価格差は、電話対応を含め、国内宛に日本語で問い合わせができる点や、日本語技術サポート、有償セミナーの半額割引(一部代理店のみ)等のサービスの差により生じている。

無料バンドル

2013年11月21日、ウルフラム・リサーチとラズベリーパイ財団は、すべてのRaspberry PiにWolfram言語とMathematica 10のパイロット版を無料でバンドルすることを発表した[40][41]。これにより、Raspberry Piの計算速度の問題は残るものの、Mathematicaの全機能を実質25ドル(Raspberry Pi Model A のボード1枚の価格)で利用できることになった。Mathematicaがコンピュータに無料でバンドルされるのは、1988年のNeXT以来、25年ぶり2度目の出来事である。

2014年1月6日、ウルフラム・リサーチとインテルは、2014年夏頃に発売予定のSD カードサイズコンピュータ Intel EdisonにWolfram言語とMathematicaを標準搭載すると発表した[42]

リリース履歴

要約
視点

ウルフラム・リサーチからリリースされたMathematicaのバージョンは以下の通り[43]:

さらに見る バージョン, リリース日 ...
バージョン リリース日 主な新機能
Mathematica 1.0 1988年6月23日 初代 Mathematica。Macintoshのサポート。NeXT社製のすべてのコンピュータにバンドル
Mathematica 1.2 1989年8月1日 Macintosh フロントエンド。リモートカーネル。初歩的微分方程式の求解。StatisticsおよびGraphicsパッケージの追加。3D グラフィックスの新しいオプションと機能の追加。
Mathematica 2.0 1991年1月15日 MathLinkプロトコル。標準フロントエンド「ノートブック」。グラフィックスの装飾機能の追加。文字列・ファイル操作。
Mathematica 2.1 1992年6月15日 Macintosh用MathLink。Windows 3.1 のサポート。
Mathematica 2.2 1993年6月1日 Windows用 MathLink。Linuxのサポート。X 用フロントエンド、オンラインマニュアル。MacintoshとNeXT用の関数ブラウザ。
Mathematica 3.0 1996年9月3日 数式タイプセット。数多くの新しい特殊関数
Mathematica 4.0 1999年5月19日 スペルチェック機能。20種類以上のデータ、画像、サウンドデータのインポート・エキスポート。ネットワークライセンス管理システム。
Mathematica 4.1 2000年11月2日 Mac OS Xのサポート。J/LinkによるJavaの統合。リアルタイム 3Dグラフィックス
Mathematica 4.2 2002年11月1日 スライドショースタイル。XML対応。XHTMLへの書き出し。
Mathematica 5.0 2003年6月12日 疎行列のサポート。.NET/Linkによる.NET Frameworkとの統合。クイックスタート。
Mathematica 5.1 2004年10月25日 SQL接続のサポート。Excelファイルのインポート・エキスポート。Webサービスのサポート。クラスタ分析ベンチマークツールMathematicaMark。
Mathematica 5.2 2005年6月20日 64ビット対応。マルチコアSSHリモート接続。
Mathematica 6.0 2007年5月1日 動的インタラクティブ機能。数学物理学化学金融地理言語学のオンラインデータベースへのアクセス。
Mathematica 6.0.1 2007年7月5日 Mathematica ドキュメントセンター。「ノートブックを評価」メニュー。Mathematica関数の例題およびチュートリアル。
Mathematica 6.0.2 2008年2月25日 バーチャルブック(Mathematicaブックの電子版)。関数ナビゲータ。Intel Macでの64ビット対応。
Mathematica 6.0.3 2008年6月23日
Mathematica 7.0 2008年11月18日 組込みの並列高性能計算。ゲノムタンパク質気象のオンラインデータベースへのアクセス。測地およびGISデータ。
Mathematica 7.0.1 2009年3月5日 基本数学・数学授業・文章作成のアシスタントパレットの日本語化。チュートリアル、「How to」ガイド、スクリーンキャスト。ドキュメントに含まれる数千に及ぶ新規例題。gridMathematica Serverとの統合。
Mathematica 8.0 2010年11月15日 Wolfram Alphaとの統合。自由形式言語入力。CDF(計算可能ドキュメント形式)。CUDAOpenCLの組込みサポート。Cコードの自動作成。3D画像のテクスチャマッピング。Mathematicaホームエディション。
Mathematica 8.0.1 2011年3月7日
Mathematica 8.0.4 2011年10月24日
Mathematica 9.0.0 2012年11月28日 入力予測インターフェイス。ソーシャルネットワーク分析。主要なデータサイエンス確率統計の新機能。3D立体画像処理機能。インタラクティブゲージ。Google マップなどのWeb APIに対応。Rとの統合。スライドショースタイルの刷新。
Mathematica 9.0.1 2013年1月30日
Mathematica 10.0.0 2014年7月21日 完全なWolfram言語に基づく初のバージョン。高度に自動化された機械学習地理情報可視化のためのGeoGraphicsの導入。ランダム過程解析の拡張。2D・3D画像処理の向上。信号処理の改善。外部デバイスおよび API接続性の向上。Wolfram Cloudとの統合。Raspberry Piへの無料バンドル。
Mathematica 10.0.1 2014年9月17日
Mathematica 10.0.2 2014年12月10日
Mathematica 10.1 2015年4月2日 Wolfram Data Dropのサポート、オブジェクトの自動認識、OpenSSLを使用した暗号化の言語レベルでのサポート、Wikipediaコンテンツへのアクセス、ユーザ定義の文法規則の配備など。
Mathematica 10.2 2015年7月14日 (日本語版は2015年8月18日リリース)コードキャプション、立体データおよび離散データの可視化のためのSliceDensityPlot3DとListStepPlot、常微分方程式および偏微分方程式における固有値および固有関数の数値解法、メールの自動処理機能、クラウド機能の拡張など。
Mathematica 10.3 2015年10月28日 地理的計算機能、単語やアルファベットの文字列操作のため言語データの追加と自然言語理解能力の向上、偏微分方程式固有値問題の記号解法のサポート、GoogleCalendar・GoogleContacts・Yelpのデータ,ArXivおよびCrossRef等のサービス接続オプションなど。
Mathematica 10.3.1 2015年12月21日 画像処理機能の安定性の向上、スペイン語スペルチェック中国語の検索機能を含むさまざまな言語と翻訳についてのサポートの向上、ユーザインターフェースの多様なアップデートなど。
Mathematica 10.4 2016年3月7日 連想におけるパターンマッチングのサポート、スケールされたプロット生成、地理的計算の形式と関数の追加、インタラクティブ画像ビューア、Wolfram Data Dropと直接連動するArduino Yunのサポート、20以上の新しいインタープリタ型、24の新しいフォントファミリの追加サポートなど。
Mathematica 10.4.1 2016年4月25日 過去のリリースにおける問題への対処と安定性の向上。
Mathematica 11.0.0 2016年8月22日 計算音声、3D印刷、ランダム行列等の新機能、および各種機能の拡張と向上。
Mathematica 11.0.1 2016年10月5日 11.0.0で発生した不具合の解決、各種機能の向上。
Mathematica 11.1 2017年4月4日 機械学習、ニューラルネットワーク、音声処理、ロバストな記述統計等の分野におけるWolfram言語の最先端機能の拡張
Mathematica 11.1.1 2017年5月9日 ListPlot3Dを使った描画の問題への対処、MacにおけるニューラルネットワークのGPUサポートの再有効化、URLFetchおよびドキュメント検索のスピード低下の問題の解決など。
Mathematica 11.2 2017年10月5日 機械学習機能の拡張、ニューラルネットワークへのCPUおよびGPUの訓練サポートを含む高性能のフレームワークの導入、微分方程式の数値・記号解の両方の提供など。
Mathematica 11.3 2018年3月22日 数学計算、音声および画像の処理、機械学習とニューラルネットワーク、システムモデリング等におけるMathematicaとWolfram言語の機能の拡張と、フロントエンドの新機能導入など。
Mathematica 12.0 2019年5月11日 数学、幾何学、地理的可視化、音声処理、画像処理、機械学習等における機能,フロントエンド機能の拡張とシステム全体の性能の向上。
Mathematica 12.1 2020年5月12日 数学的可視化、ビデオ計算(音声処理/画像処理/機械学習の動画へ適用)、機械学習とニューラルネットワーク、データアクセスと保存などの機能拡張と、パクレット(=paclet、コード/リソースのモジュラーパッケージ)管理などの新システムの導入。
Mathematica 12.2 2021年2月20日 空間統計や動画・音声分析、生体分子配列等、200以上の新関数が追加されるとともに、多くの関数やユーザインターフェースも向上。
Mathematica 12.3 2021年7月27日 100個以上の新関数、大幅に更新され機能が向上した多くの関数、数式処理関数の改良・更新、動画処理や機械学習・ニューラルネットワークの機能のさらなる拡張、Apple Silicon搭載macOSのネイティブサポート、シングルサインオンによるアクティベーションの効率化等。
Mathematica 13.0 2022年1月19日 化学反応や分子についての情報を扱う関数が強化されたほか、可視化、ビデオ関連、機械学習、最適化、物理モデリング等の分野で多くの新関数が導入され、機能も大幅に改善された。また、インストーラからドキュメントが分離(Mac版とWindows版)。ドキュメントはWebで見れるほか、別途インストールすることも可能。
Mathematica 13.1 2022年7月25日 90個の完全に新しい関数の他、機能が大きく向上した203個の関数、新しいユーザインターフェース機能、改良されたコンパイラ機能や、モデルの結果に対する特徴のインパクトをプロットする新しい機械学習関数の追加。
Mathematica 13.2 2023年1月16日 機械学習やコンパイルにおける新機能が導入されている他、木構造、数学計算、動画、天文学等に関する大きく改善された関数も追加。より高速になった1変数および多変数の多項式操作。ドキュメントおよび性能も大きく向上。
Mathematica 13.3 2023年6月29日 中核の計算分野の拡張を継続する一方、LLM関数が導入され、Wolfram言語がLLMとの連携で人間・AI・計算の間をとりもつかけ橋として機能するようになった。LLMの実行結果を人間が確認・修正する媒体としてWolfram言語を活用でき、より高度なコーディングに対応可能に。
Mathematica14.0 2024年1月16日 LLMとの統合を進め、改良されたチャットノートブックではWolfram言語の計算を直接LLMとの会話に埋め込むことが可能となった。また試験的に、入力として画像を取るマルチモーダルLLMへのアクセスも可能。その他、微積分やPDE、動画編集、天文学、化学など多くの分野で機能が向上している。
Mathematica14.1 2024年7月31日 統合アプリケーション(WOLFRAM)の導入。ニューラルネットやLLM(大規模言語モデル)の操作、コンテンツの比較、画像や動画の操作、生体分子や天体物理学等における科学的評価のための新しいツールが提供されている。
Wolfram Mathematica 14.2 2025年1月23日
閉じる

要約
視点

方程式 ex = x2 + 2 において x = -1 を開始点としてその根を数値的に求める。

In[1]:= FindRoot[Exp[x] == x^2 + 2, {x, -1}]
Out[1]= {x -> 1.3190736768573652}

次の例では、インデックスの原点を0とする 6 × 6 の行列ij 番目のエントリの値が ij であり、0のエントリを1に置き換えたものの行列式を求めている。そのような行列式は0である。

In[2]:= Det[Array[Times, {6, 6}, 0] /. 0 -> 1]
Out[2]= 0

一般的なプログラミング言語と大きく異なる点として、Mathematica ではリストのインデックスが 1 から始まることに注意が必要である。

マルチパラダイムと一つの言語

Mathematicaはマルチパラダイム・プログラミング言語であり、一つの問題に対して複数のアプローチを取ることが可能である。

ここでは簡単な例として、最大公約数 GCD(x, y) のテーブルを作る問題を考える(ここで、1 ≤ x ≤ 5、1 ≤ y ≤ 5 とする)。これには、少なくとも次の4つのアプローチが考えられる。

1. 関数型のアプローチ:

In[3]:= Array[GCD, {5, 5}]
Out[3]= {{1, 1, 1, 1, 1}, {1, 2, 1, 2, 1}, {1, 1, 3, 1, 1}, {1, 2, 1, 4, 1}, {1, 1, 1, 1, 5}}

このアプローチは、表現が抽象的ではあるが、組み込み関数の性能を十分に引き出しており、簡潔で計算速度も速い。Array は引数として任意の関数を許容する(名前があるかどうかを問わない)ので、スロット #n を使って、& の後に対応する関数を記述することができる。したがって、上記の関数は Array[GCD[#1, #2]&, {5, 5}] とも記述できるが、Mathematicaではそれを上記のように省略してもよいようになっている。

2. APL 的なアプローチ:

In[5]:= Outer[GCD, Range[5], Range[[5]]
Out[5]= {{1, 1, 1, 1, 1}, {1, 2, 1, 2, 1}, {1, 1, 3, 1, 1}, {1, 2, 1, 4, 1}, {1, 1, 1, 1, 5}}

ここで、OuterRange はそれぞれ APL の外積演算子とイオタ演算子に対応している。OuterArray と同様、引数として任意の関数を許容する。

3. Table を使うアプローチ:

In[4]:= Table[GCD[x, y], {x, 1, 5}, {y, 1, 5}]
Out[4]= {{1, 1, 1, 1, 1}, {1, 2, 1, 2, 1}, {1, 1, 3, 1, 1}, {1, 2, 1, 4, 1}, {1, 1, 1, 1, 5}}

Table は任意の次元の表を作るのに使われる標準的な関数である。このアプローチは、GCD の取る引数が明示的で、直感的に理解しやすい。反面、上記1・2に比べると計算速度で若干劣る。

4. 手続き型のアプローチ:

In[6]:=
    lst1 = {}; (* 空のリストを初期化 *)
    For[i = 1, i <= 5, i++,
        lst2 = {}; 
        For[j = 1, j <= 5, j++,
            lst2 = Append[lst2, GCD[i, j]]
        ]; 
        lst1 = Append[lst1, lst2]; (* 部分リストを繋ぐ。これが行となる *)
    ];
    lst1
Out[6]= {{1, 1, 1, 1, 1}, {1, 2, 1, 2, 1}, {1, 1, 3, 1, 1}, {1, 2, 1, 4, 1}, {1, 1, 1, 1, 5}}

これは C 言語FORTRAN などで馴染み深いアプローチである。しかし、組み込み関数を使った場合(上記1~3)に比べるとコードが冗長である。また、手続き型のアプローチは計算速度が遅くボトルネックになりやすいので、注意が必要である。

以上の例で見たように、Mathematicaプログラミングにおいては、組み込み関数を最大限に利用することが非常に重要である。Mathematicaの組み込み関数を有効に使うことで、問題を簡潔に表現することができる。また、Mathematicaの組み込み関数は、適切なアルゴリズムを用い、高度に最適化され、かつC言語で実装されているため、同じ機能を持つユーザー定義関数に比べて計算速度が圧倒的に速い[44]

すべては「式」である

Mathematicaは「すべては式である (Everything is an expression.)」という思想のもとに設計されている[45]。ここで言う「式 (Expression)」とは、アトムと関数である。

Mathematicaにおいて、数式・リスト・グラフィックスを含むすべてのオブジェクトは head[e1, e2, ...] という共通の基本構造を持つ。そして、この構造は入れ子にできる(つまり、e1e2 もまたこの構造を持てる)。したがって、どんなに複雑なオブジェクトでも、この基本構造とその再帰的な繰り返しで表現できる。

例えば、x^4+1 という式を入力すると、出力は以下のように表示される。

In[7]:= x^4 + 1
Out[7]= 1+x4

FullForm を使うと、この式の完全形(Mathematica における内部表現)を見られる。

In[8]:= FullForm[x^4 + 1]
Out[8]= Plus[1, Power[x, 4]]

上記の例では、Plushead であり、Power[x, 4] が入れ子になっている。x のような記号も実は Symbol["x"] という構造を持っている。

リストも Listhead とする同様の構造である。例えば、x^4+1{1, x^4} という2つの表現は、外見はまったく異なるが、完全形で見れば headPlusList かの違いしかない。

この基本構造により、リストとは無関係の普通の式をリスト演算子で処理できる。

In[9]:= Expand[(Cos[x] + 2 Log[x^11])/13][[2, 1]]
Out[9]= 2/13

逆も同様で、リストを普通の式のように扱える。

In[10]:= Map[Apply[Log, #]&, {{2, x}, {3, x}, {4, x}}]
Out[10]= {Log[x]/Log[2], Log[x]/Log[3], Log[x]/Log[4]}

ここで、Apply は第二引数の head を第一引数で指定されたものに置換する関数である。また、Map は関数型言語によく見られる高階関数 map である。

Mathematica では、数学的オブジェクトがリスト構造と等価であるため、組み込み関数のいくつかは「スレッディング」可能であり、特に指定しなくてもリスト上の各要素にマップされるときにマルチスレッド化される。実際、Apply は次のような場合にマルチスレッド化される。

In[11]:= Apply[Log, {{2, x}, {3, x}, {4, x}}, 1]
Out[11]= {Log[x]/Log[2], Log[x]/Log[3], Log[x]/Log[4]}

第三引数 1 により、Apply によって置換するのがリストの最初のレベルであることが指定され、これは前述の例と等価である。

脚注

関連文献

関連項目

外部リンク

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.