MATLAB Coder
先週、ひょんな所から援軍が来たとかいって喜んでましたが、実はそれはそれとして急ぎの仕事が大量にある事が発覚。結局、超絶忙しいままです。ぎゃー。
といいつつ、現実逃避気味に、R2011aで追加されたMATLAB Coderをいじって見ました。
これは、mファイルをCコード化してくれるものですが、意外と本格的なツールである事が発覚。いろいろと楽しめそうなブツです。
とりあえず、MATLABコマンドプロンプトにて
coder
と入力すると、プロジェクト作成画面が表示されます。
プロジェクト作成画面
あんまり時間がないので、まずは単純なプログラムを生成してみることにしました。
コード生成してみよう
プロジェクトを作成すると、MALTAB画面にこんなのが表示されます。プロジェクト管理画面なのですが、いいですねなんとなく。
プロジェクト管理画面
codertest.m という mファイルを1つ作成して登録すると、こんな感じになります。注目は、「input_args <未定義>」という部分です。MATLAB Coderにかけるには、引数の型を全て定義しないといけません。
mファイルを1つ登録した
この引数の横にあるボタンをクリックすると、定義画面が表示されます。せっかくなのでint32にしてみましょう。
せっかくなのでint32を選ぶぜ
すると、こんな感じで定義されます。
引数の型が定義された
では、入力値を2倍にするスクリプトを書いて見ましょう。あえて引数を double にしなかったのがキモです。うふふ。
入力値を2倍に
では、「ビルド」ボタンをクリックしてコンパイル開始!
ビルドタブ
ビルドが完了しました。いいかんじ。
ビルド完了
生成されたコードをながめる
さて、肝心かなめのCコードはどうなっているのでしょうか?
アルゴリズムの中心っぽいのをさがしてみましたらば、こんな感じになっていました。ちゃんとオーバーフロー対策もされていますね。エライ!
生成されたCコード
んで、そのアルゴリズムを呼び出しているのが、こちらの関数。マーシャラーがアルゴリズムの前後にはさまっていますね。要するに、次のようなフローを実現しているようです。
「MATLAB変数(mxArray)」→(マーシャラー)→「C言語の変数」→(アルゴリズム本体)→「C言語の変数」→(マーシャラー)→「MATLAB変数(mxArray)」
このmxArrayというのは、MATLAB変数をC言語から扱うときの構造体です。MATLAB変数は、VBでいうVariant型みたいな感じで便利なのですが、それゆえにCから扱うのは面倒なのです。
MATLAB Coderは、そのあたりをマーシャラーかまして解決しているのですね。
アルゴリズムを呼び出す部分
動かしてみる
さて、では生成したコマンドを実行してみましょうか。すると・・・エラー発生!
おこられた
引数の型が厳密に定義されているため、キッチリ int32を渡してやらないといけないようです。ちゃんと渡してやると・・・ちゃんとうごきます。
うごいた
まとめ
本当は、もっといろいろ確かめたかったのですが時間切れです。個人的な趣味で調べたいのは、
・どこまでの型に対応できるのか?数値、文字列、セル配列、、、
・どこまでMATLABコマンドを呼び出せるのか?たとえば、SimulinkモデルのスタイルチェッカースクリプトをCコード化できたりする?
の2方向です。
ユーザー的にうれしいであろう事は、たとえばSimulinkモデルへのアルゴリズム埋め込みでしょうか。とあるお客様から、「既存の資産として、mファイルがいっぱいあるんだけど、これSimulinkで何とかならないかなぁ?」と相談されたことがあります。
その頃はまだMATLAB Coderが無かったため、「それ用のSimulinkブロックは確かにありますが、制限がキツくて大変ですよー」とお答えした記憶があります。
MATLAB Coderを使うと、どれくらいラクに埋め込みが出来るのか、チャレンジしてみたいところではあります。