Mathematica にCコード,あるいは外部プログラムを組み込む方法を教えてください.
Mathematica 内から直接外部プログラムを実行することは,ほとんどのコンピュータシステムで可能です.Mathematica を使うと,外部Cプログラムを制御すること,あるいは,情報やデータをCプログラムと交換することができます.ここでは,Mathematica から外部プログラムを実行する方法と,MathLink 通信APIの設定方法を説明します.
プロセス間通信メカニズムを使ったデータ交換
Mathematica は,パイプのようなプロセス間通信メカニズムをサポートするオペレーティングシステムを通して,外部プログラムと通信することができます.もっとも単純な場合には,必要な通信がテキストファイルの送受信だけになることがあります.一般的に,Mathematica では,外部プログラムと交換されたデータストリームをファイルのように扱うことができます.ファイル名の代りに,以下のように実行する外部コマンドに感嘆符を前置したものを使います.
<< "!command"
このコマンドはMathematica に,外部コマンドを実行し,それによって生成される出力を読み込むよう指示します.
expr >> "!command"
このコマンドはexpr のテキスト形式を外部コマンドにフィードするためのものです.下の例では,式x^2 + y^2が外部コマンドlprの入力として送られます.lprは,典型的なBerkeley Unixシステムではプリンタに出力を送ります.
x^2 + y^2 >> "!lpr"
ReadList["!command", Number]
これは外部コマンドを実行してから,それが生成する数のリストを読み込むためのものです.下の例では,外部コマンドsquares 4が実行された後,Mathematica がsquares 4が生成した出力から数値を読みます.
ReadList["!squares 4", Number, RecordLists->True]
![[Graphics:Images/index_gr_1.gif]](Images/index_gr_1.gif)
注記
テキストベースのインターフェースでは,行頭に!を置くと行の残りの部分が外部プログラムとして実行されます.
!squares 4
プロセス間通信メカニズム使用に関する詳細
Mathematica ブックの1.11.10をご覧ください.
MathLink を使ったCコードのMathematica へのリンク方法
上でテキストを外部プログラムと交換する方法について説明しましたが,より高いレベルで外部プログラムと通信したり,より構造化されたデータを交換したりできると便利な場合もあるでしょう.このようなことを実現するためには,外部データとMathematica 間の双方向通信のための標準プロトコル,MathLink を使います.
MathLink を使うためには,外部プログラムに特殊なソースコードが含まれていなければなりません.このコードは通常Mathematica に付属しています.MathLink を使うと,外部プログラムがMathematica を呼び出すことも,Mathematica が外部プログラムを呼び出すことも可能です.Mathematica を使って外部プログラムの中の各関数を呼び出すこともできます.Mathematica ブックの2.12で説明されているように,MathLink を使って外部プログラムと通信するための手順は以下の通りです.
-
Mathematica のある関数が,どのように外部プログラム内の関数を呼び出すかを指定するようにMathLink テンプレートファイルを設定する.
-
MathLink テンプレートファイルから,プログラムに含むソースコードを生成する.
-
プログラムを実行すると,適切なMathematica 定義が自動的に作成される.あるMathematica 関数を呼び出すと,外部プログラム内のコードが実行される.
MathLink テンプレートファイルの設定
外部プログラムで定義された関数がある場合,引数をその関数に渡して,それが生成する結果を取り戻す適切なMathLink コードを加えると,Mathematica 内から関数を呼び出すことができるようになります.簡単な場合は,各外部関数に対する適切なMathLink テンプレートを与えることだけで,必要なコードを生成することができます.MathLink テンプレートはfile.tmという形式の名前のファイルに置かれるようになっています.このようなファイルには,異なる関数のテンプレート間に散在するCソースコードも含まれることがあります.以下はMathLink テンプレートファイルのエレメントです.
![[Graphics:Images/index_gr_3.gif]](Images/index_gr_3.gif)
f.tmというMathLink テンプレートファイルの例です.
:Begin:
:Function: f
:Pattern: f[x_Integer, y_Integer]
:Arguments: {x, y}
:ArgumentTypes: {Integer, Integer}
:ReturnType: Integer
:End:
プログラムに含むソースコードの生成
ある外部関数のためのMathLink テンプレートを作成したら,そのテンプレートとその関数のための実際のソースコードとを組み合せる必要があります.ソースコードはCプログラミング言語で書かれているとすると,標準的なMathLink ヘッダファイルを含む行を加えてから小さいmainプログラムを挿入することで組み合せることができます.以下は,Cソースコードを含むファイルf.cの例です.
標準MathLink ヘッダファイルを加える.
#include "mathlink.h"
関数fの実際のソースコード.
int f(int x, int y) {
return x+y;
}
以下で外部プログラムがMathematica からのリクエストに応じる準備ができるよう設定する.
int main(int argc, char *argv[]) {
return MLMain(argc, argv);
}
要求されるmainの形式は,システムによってわずかに異なることがあるという点にご注意ください.MathLink デベロッパーキットに含まれるリリースノートに,システムごとの適切な形式が記載されています.
適切なファイルを設定したら,MathLink のテンプレート情報を処理して,ソースコードをすべてコンパイルする必要があります.この操作は,一般的にさまざまな外部プログラムを実行することで行われますが,詳細はコンピュータシステムによって異なります.
例えば,UnixではMathLink Developers Kitにmccというプログラムが含まれています.これは.tmで終わる名前の任意のファイルのMathLink テンプレートを前処理してから,その結果のCソースコードに対してccを呼び出します.プログラムmccは,ccにコマンドラインオプションと他のファイルを直接渡します.
以下のコマンドでf.tmを前処理して,その結果のCソースファイルをファイルf.cとともにコンパイルする.
mcc -o f.exe f.tm f.c
Unix以外のシステムでは,MathLink Developers Kitには通常mprepというプログラムが含まれています.このプログラムは,前処理したい.tmファイルすべてを入力として与えて,直接呼び出さなければなりません.mprepは出力としてCソースコードを生成するので,それをCコンパイラに送ることができます.
Mathematica から外部関数を呼び出す
これでMathematica から外部プログラムを呼び出して使うことができるようになります.まず,Installを使ってMathematica に外部プログラムについて知らせます.
Install["f.exe"]
![[Graphics:Images/index_gr_4.gif]](Images/index_gr_4.gif)
ここで外部関数のf(int x, int y)を呼び出すと,2つの整数が加算されます.
f[6, 9]
![[Graphics:Images/index_gr_5.gif]](Images/index_gr_5.gif)
MathLink の使用に関する追加情報
MathLink の使用,およびMathematica と外部プログラムとの通信の設定に関する追加情報はMathematica ブックとMathLink ドキュメントに記載されています.追加情報は以下の部分をご覧ください.
Mathematica ブック
1.11.11
2.12
MathLink ドキュメント
完全ドキュメントは,ヘルプブラウザの「アドオン」→「MathLink」でご覧ください.ここにはMathLink のイントロダクションからいろいろなMathLink コマンドの使い方の説明,システム特有の情報まで収められています.
Mathcode C++ を使う
MathCode C++ コード生成システムにより,Mathematica の開発者は高性能のパフォーマンス,接続性,使いやすい行列演算が利用できます.この製品の中核は,Mathematica コードのサブセットをスタンドアロンのアプリケーションにしたり,MathLink 通信プロトコルを使ってMathematica から簡単に呼び出したりできるC++へ変換することです.MathCode C++ はMicrosoft Visual C++,およびUnixプラットフォームではCC/gccで使うことができます.MathCode C++ についての追加情報は,Wolfram ResearchのWebサイトをご覧ください.
|