Simulinkで機械学習モデルを使いたい


はじめに

Simulinkでガウス過程回帰モデルを用いたいと思ったのですが,少しハマったのでメモ.

やりたいこと

オフラインで,fitrgpコマンドで作成したガウス過程回帰モデルを作成した.
このモデルをMATLAB function ブロック内で用いて,変数Yを推定したい.

解決方法

1) XからYを予測するガウス過程回帰モデルを作成したら,saveCompactModelでモデルを保存する.

gpr_predict.m
gprMdl = fitrgp(X, Y);
saveCompactModel(gprMdl, 'GPRModel');

2) (Simulink内 MATLAB Function blockにおいて)loadCompactModelでモデルを呼び出してpredictでYを計算する.

predict_Y
gprMdl = loadCompactModel('GPRModel');
Y = predict(gprMdl, X_online);

公式のページは以下を参照.
機械学習モデルの予測をコマンド ラインで行うコードの生成

ハマった方法

普通にmat ファイル形式でsave(gprMdl, 'GPRModel')とやると,Simulinkでは扱えない形式になってしまう.
具体的には,以下のエラーが出てくる.

調整不可プロパティをもつクラスは外部関数からの出力としてサポートされません

なんのことやら,という感じ.

データストアメモリを用いてもグローバル変数にしようとしても,だめだった.
サポートされているデータ型しか受け付けないらしい.

以前Simulinkで困ったときに,コード生成に対応しているかどうかが重要だったような・・・という記憶を頼りに調べたら上のサイトを見つけることができ,無事に解決したが,小一時間程度要してしまった.

Simulinkを用いるときにはコード生成に対応しているかどうかをチェックする癖をつけないと,また同じような問題にトラップされそう・・・
今後も気をつけよう(自戒).