MATLAB & Python
お仕事でMATLAB向けツールを作る場合、m-fileで書く場合が殆どです。m-fileは、小規模なツールを作る分には問題ありませんが、世の中のスクリプト言語たちと比べるとパワー不足が目立ちます。
さて、使い捨てツールのつもりで作ったものがバカうけして、いつのまにかお客様の開発を支える重要なインフラになっちゃったやつがあります。(ツール屋さんのお仕事で書いたものとは、ぜんぜん別のものです)
このツールには、あの機能をのせたい、この機能をのせたい、という要望がモリモリ来て、いつのまにか、それなりの規模になってしまいました。とうとう、これ以上、m-fileでメンテナンスをするのは無理!という所まで来てしまったため、脱出先を検討しています。
Pythonで、いってみよう
あれこれ調べて、さんざん迷った挙句、仮決定したのはPythonです。Pythonは、m-fileからの移植する場合、比較的ストレートに移植できます。
たとえば、MATLABの配列から、非0の要素だけ取り出すには、こう書けます。
>> array1 = [ 0 1 2 3 0 4 5 6 ]
>> array2 = array1( array1 ~= 0 )
結果、array2 = [ 1 2 3 4 5 6 ] となります。
一方、Pythonで書くと、次のようになります。
>> array1 = [ 0, 1, 2, 3, 0, 4, 5, 6 ]
>> array2 =[ x for x in array1 if x != 0 ]
結果、array2 = [ 1, 2, 3, 4, 5, 6 ] となります。
ちょっぴり表記方法は違いますが、m-fileで出来る処理が、Pythonでも同じ考え方のまま実現できるというのは心強い限りです。
(ちなみに、m-fileからPythonに変換してくれる、MATLAB-to-Python Compilerというツールもありますが、試してはいません。)
MATLABとPythonをつなぐ
ツールをPythonに移植するからといって、MATLABがいらなくなる訳ではありません。単なる計算や、ファイルの処理であればPythonで十分ですが、Simulinkモデルが関係するような処理は、MATLABが必須です。
そのためには、MATLABからPythonを呼び出せるようにしないといけません。これには、pymexというMATLABとPythonとの橋渡しをしてくれるツールが使えそうです。
これが動作すれば、
・複雑なので、Pythonで書きたい部分
・MATLABで書かないと仕方がない部分
の2つを協調動作させられます。
具体的には、pymexを使うことで次の事が実現できます。
・MATLABから、Pythonモジュールを呼び出せる(引数つきで)
・Pythonからの戻り値を受け取れる
ポイントは、MATLAB変数と、Python変数の間の変換をしてくれるところにあり、pymexのソースコードの大部分は、その処理に費やされています。
さて、このpymexは、基本的にすばらしいツールなのですが、どうやら開発が放棄されてしまっている模様。そのため、Pythonの最新版では動作してくれません。また、私がやりたい事とは微妙にズレているため、機能拡張も必要です。
運がいいことに、これはMITライセンスを採用している模様。著作権表示さえしておけば、勝手に改造したあげく、お客様のプロジェクトに適用しても問題なさそうです。
具体的に、このツールにどんな機能を持たせたいのか?それはどういった理由から?といった事は、又の機会に書くことにします。また、完成品はこちらのブログで公開する予定です。(空き時間にしか作業できないので、いつになるのか分かりませんが)