一般的なコード生成のワークフロー
機械学習モデルのオブジェクト関数ではない Statistics and Machine Learning Toolbox™ の関数に対する一般的なコード生成のワークフローは、MATLAB® Coder™ で説明されているワークフローと同じです。詳細については、MATLAB Coder 入門 (MATLAB Coder)を参照してください。機械学習モデルのオブジェクト関数のコード生成方法を学ぶには、コード生成の紹介を参照してください。
この例では、次のフローチャートで要約されている一般的なコード生成のワークフローについて簡単に説明します。
エントリポイント関数の定義
"エントリポイント" 関数は、コード生成用に定義する関数で、"最上位" 関数または "プライマリ" 関数とも呼ばれます。codegen
(MATLAB Coder) を使用して最上位レベルの関数を呼び出すことはできないので、コード生成に対応する関数を呼び出すエントリポイント関数を定義し、codegen
を使用してエントリポイント関数の C/C++ コードを生成しなければなりません。エントリポイント関数内のすべての関数がコード生成をサポートしなければなりません。
MATLAB のアルゴリズムについてのコードを生成しようとしていることを指示するため、コンパイラ命令 %#codegen
(またはプラグマ) をエントリポイント関数のシグネチャの後に追加します。この命令を追加すると、コード生成時にエラーになる違反の診断と修正を MATLAB Code Analyzer が支援します。コード アナライザーによるコードのチェック (MATLAB Coder)を参照してください。
たとえば、iqr
を使用してデータ セットの四分位数間範囲を推定するコードを生成するには、次の関数を定義します。
function r = iqrCodeGen(x) %#codegen %IQRCODEGEN Estimate interquartile range % iqrCodeGen returns the interquartile range of the data x, % a single- or double-precision vector. r = iqr(x); end
varargin
を指定することにより、オプションの入力引数に対応できます。詳細は、可変長引数リストのコード生成 (MATLAB Coder) と コード生成用の可変サイズ引数の指定 を参照してください。コードの生成
コンパイラの設定
C/C++ コードを生成するには、正しく設定されたコンパイラにアクセスできなければなりません。MATLAB Coder は、サポートされているインストール済みコンパイラを探して使用します。既定の C コンパイラを表示および変更するには、次のように入力します。
mex -setup
codegen
の使用によるコードの生成
コンパイラを設定した後で、codegen
(MATLAB Coder) または MATLAB Coder アプリを使用してエントリポイント関数のコードを生成します。MATLAB Coder アプリを使用してコードを生成する方法については、MATLAB Coder アプリを使用した MEX 関数の生成 (MATLAB Coder)を参照してください。
コマンド ラインでコードを生成するには、codegen
(MATLAB Coder) を使用します。C および C++ は静的な型の言語なので、エントリポイント関数内のすべての変数のプロパティをコンパイル時に決定しなければなりません。codegen
を呼び出すときに -args
オプションを使用して、エントリポイント関数のすべての入力についてデータ型とサイズを指定します。
データ型と正確な入力配列のサイズを指定するため、特定のデータ型および配列サイズをもつ一連の値を表す MATLAB 式を渡します。たとえば、
iqrCodeGen.m
から生成されたコードは 100 個の要素がある倍精度数値列ベクトルを受け入れなければならないことを指定するには、次のように入力します。testX = randn(100,1); codegen iqrCodeGen -args {testX} -report
-report
フラグは、コード生成レポートを生成します。コード生成レポート (MATLAB Coder)を参照してください。1 つ以上の次元を任意の長さにすることができるよう指定するには、次のように
-args
オプションでcoder.typeof
(MATLAB Coder) を使用します。-args {coder.typeof(example_value, size_vector, variable_dims)}
example_value
、size_vector
、variable_dims
の値は、生成されるコードが受け入れることができる入力配列のプロパティを指定します。入力配列は、
example_value
の例の値と同じデータ型です。対応する
variable_dims
の値がfalse
である場合、size_vector
は入力配列の配列サイズです。対応する
variable_dims
の値がtrue
である場合、size_vector
は配列サイズの上限です。variable_dims
は、配列の各次元が可変サイズと固定サイズのどちらであるかを指定します。値true
(logical 1) は対応する次元が可変サイズであることを意味します。値false
(logical 0) は対応する次元が固定サイズであることを意味します。
可変サイズの入力の指定は、コンパイル時に観測値の個数が不明であるデータの場合に便利です。たとえば、
iqrCodeGen.m
から生成されたコードが任意の長さの倍精度数値列ベクトルを受け入れることができるよう指定するには、次のように入力します。testX = coder.typeof(0,[Inf,1],[1,0]); codegen iqrCodeGen -args {testX} -report
MATLAB の既定の数値データ型は
double
なので、example_value
の0
という値はデータ型がdouble
であることを意味します。size_vector
の[Inf,1]
という値とvariable_dims
の[1,0]
という値は、1 番目の次元のサイズが可変で制限がなく、2 番目の次元のサイズが 1 に固定されることを意味します。メモ
可変サイズ入力の指定はパフォーマンスに影響する可能性があります。詳細については、可変サイズの配列に対するメモリ割り当ての制御 (MATLAB Coder)を参照してください。
サポートされる名前と値のペアの引数などの文字配列を指定するには、
coder.Constant
(MATLAB Coder) を使用して文字配列を定数として指定します。たとえば、'Name'
がiqrCodeGen.m
の有効な名前と値のペアの引数であり、対応する値value
が数値であるとします。この場合、次のように入力します。codegen iqrCodeGen -args {testX,coder.Constant('Name'),value} -report
詳細については、コマンド ラインでの C コードの生成 (MATLAB Coder)およびエントリポイント関数の入力のプロパティの指定 (MATLAB Coder)を参照してください。
ビルド タイプ
MATLAB Coder は、以下のタイプについてコードを生成できます。
MEX (MATLAB 実行可能ファイル) 関数
スタンドアロン C/C++ コード
スタティック ライブラリにコンパイルされるスタンドアロン C/C++ コード
ダイナミック リンク ライブラリにコンパイルされるスタンドアロン C/C++ コード
実行可能ファイルにコンパイルされるスタンドアロン C/C++ コード
codegen
(MATLAB Coder) の -config
オプションを使用して、ビルド タイプを指定できます。コード生成オプションの設定の詳細については、ビルド設定の構成 (MATLAB Coder)を参照してください。
既定では、codegen
は MEX 関数を生成します。MEX 関数は、MATLAB から実行できる C/C++ プログラムです。MEX 関数を使用すると、MATLAB のアルゴリズムを高速化し、生成されたコードの機能と実行時の問題をテストすることができます。詳細は、MATLAB アルゴリズムの高速化 (MATLAB Coder) と MATLAB で MEX 関数をテストする理由 (MATLAB Coder) を参照してください。
コード生成レポート
-report
フラグを使用して、コード生成レポートを作成できます。このレポートは、コード生成の問題のデバッグと、生成された C/C++ コードの確認に役立ちます。詳細については、コード生成レポート (MATLAB Coder)を参照してください。
生成されたコードの確認
MEX 関数をテストして、生成されたコードが元の MATLAB コードと同じ機能を提供するかどうかを確認します。このテストを実行するため、元の MATLAB コードの実行に使用したものと同じ入力を使用して MEX 関数を実行してから、結果を比較します。スタンドアロン コードを生成する前に MATLAB で MEX 関数を実行すると、実行時エラーを検出して修正することもできます。生成されたスタンドアロン コードでは、このようなエラーの診断がはるかに困難になります。詳細は、MATLAB で MEX 関数をテストする理由 (MATLAB Coder)を参照してください。
データを渡して、iqr
、iqrCodeGen
および iqrCodeGen_mex
が同じ四分位数間範囲を返すかどうかを確認します。
testX = randn(100,1); r = iqr(testX); r_entrypoint = iqrCodeGen(testX); r_mex = iqrCodeGen_mex(testX);
isequal
を使用して出力を比較します。
isequal(r,r_entrypoint,r_mex)
すべての入力が等しい場合、isequal
は logical 1 (true) を返します。
テスト ファイルと coder.runTest
(MATLAB Coder) を使用して MEX 関数を確認することもできます。詳細については、MATLAB コードから生成されるコードのテスト (MATLAB Coder)を参照してください。
参考
codegen
(MATLAB Coder)