September 27, 2006

Matlab mexでCygwin gccやg77を使う(gnumex)

最近Matlabを使うようになってきました。お金がかかるツールはできる限り使わないポリシーなのですが、効率をあげるためにはやむを得ません。Matlabよくできていますね、何でもコマンド一発だし。そういうわけで今回はMatlabの使い方ネタを。

しかし、Matlabを使うといっても、残念ながらこの記事はタイトルにあるように普通の使い方の紹介ではありません(笑)。ではなんの話かというと、Matlab外部の資産、つまりCやFortranで書いたコードをWindows版Matlabと連携して使うという話です。しかもCygwinの無償コンパイラを利用して追加費用は一切なしで。

詳細は続きをどうぞ。

Matlabにはmexという機構が用意されています。これはMatlabからC言語やFortran言語で書かれた関数を呼び出し計算させるという仕組み(『MATLABからのCおよびFortranプログラムの呼び出し』を参考)なのですが、具体的には、お決まりの名前や引数の数で関数を作ってダイナミックリンクライブラリにしておくと、元々備わっているMatlabの関数と同じように使えますよ、ということです。
関数の名前の付け方や引数などは本家サイトのヘルプやサンプルコード(Matlabインストールディレクトリのextern/examples/mexに例があります)に譲るとして、ここではライブラリを作る方法について考察してみたいと思います。

ライブラリを作るにはmexというコマンドをMatlabで実行します。

mex (呼び出したい関数があるファイル名)

はじめてこのコマンドを実行するとき、ライブラリを作るコンパイラは何にするかたずねられると思います(一度目でなくともmex -setupすることでコンパイラの選択をしなおすことができます)。Windows版Matlab ver.2006aでの実行結果を見てみると

Select a compiler:
[1] Borland C++Builder version 6.0
[2] Borland C++Builder version 5.0
[3] Borland C/C++ (free command line tools) version 5.5
[4] Compaq Visual Fortran version 6.1
[5] Compaq Visual Fortran version 6.6
[6] Intel Visual Fortran version 9.0
[7] Lcc C version 2.4.1
[8] Microsoft Visual C/C++ version 8.0
[9] Microsoft Visual C/C++ version 7.1
[10] Microsoft Visual C/C++ version 6.0
[11] Open WATCOM C/C++ version 1.3

BorlandやM$のVC8.0(無償のVisual Studio 2005 Express Editionについてくるコンパイラと同じ)は違いますが、基本有償のものばっかりですね。コンパイラの機能としては前述のダイナミックリンクライブラリが作成できればいいので、WindowsならCygwinのgccやg77でもできるはずです。ということで、前置きが長くなりましたが、Cygwinのgccやg77でmexする方法を調べてみました。

検索してみると既に、まさに、なプロジェクトはあるようでgnumexというのが引っかかります。そして、このサイトで述べられていることを忠実に実行すればできてしまいました。
前置きが長い割に何だリンクだけか、というのもあれなので、補足説明を書いておこうと思います。

gnumexでサポートされるコンパイラについでてすが、これは3種類あると述べられています。Cygwin版gcc(g77も、以下同じ)、Mingw版gcc、そしてCygwin版gccで-mno-cygwinオプションをつけたもの(Cygwin/mingwとサイトでは記述)の3つです。Cygwin版gccというのはcygwin1.dllというUNIXエミュレーションレイヤ(Windowsに無理やりUNIXの動作をさせるために間を取り持つライブラリ)に依存したバイナリを吐くもので、一方Mingw版gccは標準装備されているWindowsの実行ライブラリに依存したバイナリを吐くもの、最後のCygwin/mingwはCygwin版gccを使いつつもWindowsの実行ライブラリに依存したバイナリを吐くコンパイラです。
一番無難なのはMingw版gccだと思いますが、僕はcygwin版gccを使ってmexを試してみたところ、問題なく動作したのでcygwin版でも大丈夫だと思います。Cygwin/mingwは試していません。

Cygwin版gccでmexする際の注意ですが、動作の際は前述のとおりcygwin1.dllが必要となります。つまり動作環境においてcygwin1.dllにパスが通っている必要があります。[マイ コンピュータ]-(右クリック)-[プロパティ]-[詳細設定]-[環境変数]-[システム環境変数]のPATHの項目に(Cygwinインストールディレクトリ)¥binを追加してください。パスが通っていない場合、実行時にエラーが表示されると思います。

以上で動作すると思います。それでは快適なMatlab自動化ライフを(笑)。

※似たような内容で『CygwinのRubyからMatlabを扱う』という記事もあります。

23:58 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | トラックバック
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/519
コメント

先生!試したくても、Matlabがないです!(汗
こういうネタは酔漢さんが好きそうだけど・・・。

Posted by: まや : September 28, 2006 09:22 AM

なぜ私に振りますか(w > まやさん。興味はありますが、手を出せない領域です。

Posted by: 酔漢 : September 29, 2006 07:40 AM

>まやさん、酔漢さん
Matlab自体面白いですよ。Simulinkと組み合わせれば、ブロックを線でつなぐだけで色々と信号処理のシミュレーションできちゃいます。

Posted by: fenrir : September 30, 2006 04:42 PM
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。