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を使うと、どれくらいラクに埋め込みが出来るのか、チャレンジしてみたいところではあります。