最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

MATLAB Coder が生成コードを分割する方法

生成ファイルの分割

既定では、コードの生成中に、MATLAB® Coder™ はコードを MATLAB ファイル構造に一致するように分割します。この 1 対 1 のマッピングにより、C/C++ で生成されたファイルとコンパイルされた MATLAB コードを容易に関連付けることができます。MATLAB Coder は、生成コード内でインライン化された MATLAB 関数について同様な 1 対 1 の対応を作成することはできません (ファイルの分割とインライン化を参照)。

または、すべての C/C++ 関数を単一のファイル内に生成することを選択できます。詳細は、ファイル分割法の選択方法を参照してください。このオプションを指定すると、コードと既存の組み込みソフトウェアの統合が容易になります。

ファイル分割法の選択方法

MATLAB Coder アプリの使用

  1. [生成] ダイアログ ボックスを開くために、[コード生成] ページの [生成] 矢印 をクリックします。

  2. [詳細設定] をクリックします。

  3. [コード外観] タブで、[生成されたファイルの分割法][MATLAB ファイルごとに 1 つのファイルを生成] または [すべての関数を 1 つのファイルに生成] に設定します。

コマンド ラインの入力

codegen 構成オブジェクトの FilePartitionMethod オプションを使用します。たとえば、入力のない関数 foo をコンパイルして各 MATLAB 関数に対して 1 つの C/C++ ファイルを生成するには、次の操作を実行します。

  1. MEX 構成オブジェクトを作成して FilePartitionMethod オプションを設定します。

    mexcfg = coder.config('mex');
    mexcfg.FilePartitionMethod = 'MapMFileToCFile';

  2. -config オプションを使用して、構成オブジェクトを codegen に渡します。

    codegen -config mexcfg -O disable:inline foo
    % Disable inlining to generate one C/C++ file for each MATLAB function

MATLAB ファイルごとに 1 つの C/C++ ファイルに生成ファイルを分割する

既定では、インライン化されていない MATLAB 関数の場合、MATLAB Coder は各 MATLAB ファイルに対して 1 つの C/C++ ファイルを生成します。この場合、MATLAB Coder は、生成された C/C++ コードを MATLAB ファイルに対応するように分割します。

MATLAB Coder がエントリポイント MATLAB 関数を分割する方法

各エントリポイント (最上位レベル) MATLAB 関数の場合は、MATLAB Coder は、C/C++ ソース、ヘッダーおよびオブジェクト ファイルを 1 ファイルで生成し、MATLAB ファイルと同じ名前を付けます。

たとえば、関数 identity を呼び出す簡単な関数 foo を定義するとします。ソース ファイル foo.m は、以下のコードを含みます。

function y = foo(u,v) %#codegen
s = single(u);
d = double(v);
y = double(identity(s)) + identity(d);

以下は、identity.m のコードです。

function y = identity(u) %#codegen
y = u;

MATLAB Coder アプリ内で、foo.m の C スタティック ライブラリを生成するには次の操作を実行します。

  1. 入力 u および v を定義します。詳細は、アプリを使用したエントリポイント関数の入力のプロパティの指定を参照してください。

  2. [生成] ダイアログ ボックスを開くために、[コード生成] ページの [生成] 矢印 をクリックします。

  3. [ビルド タイプ][スタティック ライブラリ] に設定します。

  4. [詳細設定] をクリックします。

  5. [すべての設定] タブの [関数のインライン化] の下で、[インラインしきい値] パラメーターを 0 に設定します。

  6. [閉じる] をクリックします。

  7. ライブラリを生成するには [生成] をクリックします。

コマンド ラインで foo.m の C スタティック ライブラリを生成するには、次のように入力します。

codegen  -config:lib -O disable:inline foo -args {0, 0}
% Use the -args option to specify that u and v are both
% real, scalar doubles

MATLAB Coder は、出力フォルダー内に foo および identity のソース、ヘッダーおよびオブジェクトの各ファイルを生成します。

MATLAB Coder がローカル関数を分割する方法

各ローカル関数について、MATLAB Coder は呼び出し元の関数と同じ C/C++ ファイル内にコードを生成します。たとえば、ローカル関数 identity を呼び出す関数 foo を以下のように定義したとします。

function y = foo(u,v) %#codegen
s = single(u);
d = double(v);
y = double(identity(s)) + identity(d);

function y = identity(u)
y = u;

C++ ライブラリを生成するには、コードを生成する前に、C++ コンパイラを選択して C++ をターゲット言語として設定します。たとえば、コマンド ラインで次のように入力します。

  1. C++ をターゲット言語として選択します。

    cfg = coder.config('lib')
    cfg.TargetLang='C++'

  2. C++ ライブラリを生成します。

    codegen -config cfg   foo -args {0, 0}
    % Use the -args option to specify that u and v are both
    % real, scalar doubles

    基本関数 foo で、MATLAB Coder がローカル関数 identity のコードをインライン化します。

    メモ

    C++ を指定する場合、MATLAB CoderC コードを .cpp ファイルにラップするため、C++ コンパイラおよび外部 C++ アプリケーションとのインターフェイスを使用できます。C++ クラスは生成しません。

    foo.cpp 内の生成コードの抜粋を次に示します。

    ...
    /* Function Definitions */
    double foo(double u, double v)
    {
      return (double)(float)u + v;
    }
    ...

MATLAB Coder がオーバーロードされた関数を分割する方法

オーバーロード関数とは、さまざまなクラスの入力に対応するために複数の実装をもつ関数のことです。各実装 (インライン化されていない) について、MATLAB Coder は一意の数値の接尾辞をもつ個別の C/C++ ファイルを生成します。

たとえば、簡単な関数 multiply_defined を以下のように定義したとします。

%#codegen
function y = multiply_defined(u)

y = u+1;

次に、multiply_defined の 2 つの実装を追加します。一方は single 型の入力 (@single サブフォルダー内) を処理し、もう一方は double 型の入力 (@double サブフォルダー内) を処理します。

各実装を呼び出すために、関数 call_multiply_defined を定義します。

%#codegen
function [y1,y2,y3] = call_multiply_defined

y1 = multiply_defined(int32(2));
y2 = multiply_defined(2);
y3 = multiply_defined(single(2));

次に、オーバーロードされた関数 multiply_defined の C コードを生成します。たとえば、MATLAB コマンド ラインで次のように入力します。

codegen -O disable:inline -config:lib call_multiply_defined

MATLAB Coder は、次に示すように multiply_defined の各実装に対して C ソース、ヘッダーおよびオブジェクトの各ファイルを生成します。数値接尾辞を使用して、一意なファイル名を作成しています。

生成ファイルと場所

生成ファイルのタイプと場所は、指定したターゲットに依存します。すべてのターゲットについて、ビルド中にエラーや警告が発生した場合、または明示的にレポートを要求した場合、MATLAB Coder はレポートを生成します。

MATLAB Coder は、同じコードまたはプロジェクトに対して同じタイプの出力を生成するたびに、前回ビルドしたファイルを削除します。新しいビルドでファイルが書き換えられないようにする場合は、ファイルを別の場所にコピーしてからビルドを開始します。

MEX ターゲットの生成ファイル

既定では、MATLAB Coder は MEX 関数 (mex) ターゲットに対して次のファイルを生成します。

ファイルのタイプ場所
プラットフォーム固有の MEX ファイル現在のフォルダー

MEX および C/C++ ソース、ヘッダーおよびオブジェクト ファイル

codegen/mex/function_name

HTML レポート

codegen/mex/function_name/html

C/C++ スタティック ライブラリ ターゲットの生成ファイル

既定では、MATLAB Coder は C/C++ スタティック ライブラリ ターゲットに対して次のファイルを生成します。

ファイルのタイプ場所

C/C++ ソース、ライブラリ、ヘッダーおよびオブジェクトの各ファイル

codegen/lib/function_name

HTML レポート

codegen/lib/function_name/html

C/C++ ダイナミック ライブラリ ターゲットの生成ファイル

既定では、MATLAB Coder は C/C++ ダイナミック ライブラリ ターゲットに対して次のファイルを生成します。

ファイルのタイプ場所

C/C++ ソース、ライブラリ、ヘッダーおよびオブジェクトの各ファイル

codegen/dll/function_name

HTML レポート

codegen/dll/function_name/html

C/C++ 実行可能ファイル ターゲットの生成ファイル

既定では、MATLAB Coder は C/C++ 実行可能ファイル ターゲットに対して次のファイルを生成します。

ファイルのタイプ場所

C/C++ ソース、ヘッダーおよびオブジェクト ファイル

codegen/exe/function_name

HTML レポート

codegen/exe/function_name/html

生成ファイルの名前と場所の変更

MATLAB Coder アプリの使用

変更対象アクション
出力ファイル名
  1. [生成] ダイアログ ボックスを開くために、[コード生成] ページの [生成] 矢印 をクリックします。

  2. [出力ファイル名] フィールドにファイル名を入力します。

出力ファイルの場所
  1. [生成] ダイアログ ボックスを開くために、[コード生成] ページの [生成] 矢印 をクリックします。

  2. [詳細設定] をクリックします。

  3. [パス] タブで [ビルド フォルダー][指定したフォルダー] に設定します。

  4. [ビルド フォルダー名] フィールドで、出力ファイルの場所を参照するか絶対パスを入力します。出力ファイルの場所に次を含めることはできません。

    • スペース (スペースを使用すると、オペレーティング システムの構成によっては、コード生成に失敗する可能性があります)

    • タブ

    • \$#*?

    • 非 7 ビット ASCII 文字 (日本語など)

コマンド ラインの入力-  codegen オプション -o および -d を使用して、生成ファイルの名前および場所を変更できます。

ファイルの分割とインライン化

生成された C/C++ コードを MATLAB Coder が分割する方法は、各 MATLAB ファイルに対して 1 つの C/C++ ファイルを生成することを選択するかどうか、および MATLAB 関数をインライン化するかどうかによって変わります。

ユーザーの操作 MATLAB Coder
すべての C/C++ 関数を単一のファイル内に生成し、インライン化を無効にする関数をインライン化せずに単一の C/C++ ファイルを生成します。
すべての C/C++ 関数を単一のファイル内に生成し、インライン化を有効にする単一の C/C++ ファイルを生成します。サイズがインライン化のしきい値以内にある関数はインライン化します。
各 MATLAB ファイルに対して 1 つの C/C++ ファイルを生成し、インライン化を無効にする生成された C/C++ コードを、MATLAB ファイル構造に一致するように分割します。MATLAB ファイルごとに 1 つの C/C++ ファイルに生成ファイルを分割するを参照してください。
各 MATLAB ファイルに対して 1 つの C/C++ ファイルを生成し、インライン化を有効にする

インライン化先の関数と同じ C/C++ ファイル内にインライン化された関数を配置します。

インライン化を有効にしても、MATLAB Coder はサイズがインライン化のしきい値内にある関数のみをインライン化します。インライン化されない MATLAB 関数については、説明したように MATLAB Coder は生成された C/C++ コードを分割します。

ファイルの分割とインライン化の間のトレードオフ

ファイルの分割をインライン化に対して比較すると、可読性、効率および MATLAB コードと既存の組み込みソフトウェアの統合の容易性の間のトレードオフが明らかになります。

ユーザーの生成操作生成される C/C++ コード長所短所
すべての C/C++ 関数を単一のファイル内に生成するMATLAB ファイル構造と一致しない既存の組み込みソフトウェアとの統合が容易C/C++ コードと元の MATLAB ファイルのマッピングが困難
各 MATLAB ファイルに対して 1 つの C/C++ ファイルを生成し、インライン化を有効にするMATLAB ファイル構造と正確には一致しないプログラムの実行が高速C/C++ コードと元の MATLAB ファイルのマッピングが困難
各 MATLAB ファイルに対して 1 つの C/C++ ファイルを生成し、インライン化を無効にするMATLAB ファイル構造と一致するC/C++ コードと元の MATLAB ファイルのマッピングが容易プログラムの実行効率が低い

インライン化の無効化がファイルの分割に与える影響

インライン化は既定で有効になっています。したがって、最上位の各 MATLAB 関数に対して 1 つの C/C++ ファイルを生成するには、次の操作を行わなければなりません。

  • 最上位レベルの各 MATLAB 関数に対して 1 つの C/C++ ファイルを生成するように選択する。詳細は、ファイル分割法の選択方法を参照してください。

  • グローバルに、または個別の MATLAB 関数に対してインライン化を明示的に無効にする。

MATLAB Coder アプリを使用してインライン化をグローバルに無効にする方法

  1. [生成] ダイアログ ボックスを開くために、[コード生成] ページの [生成] 矢印 をクリックします。

  2. [詳細設定] をクリックします。

  3. [すべての設定] タブの [関数のインライン化] の下で、[インラインしきい値]0 に設定します。

コマンド ラインでインライン化をグローバルに無効にする方法-  関数のインライン化を無効にするには、codegen-O disable:inline オプションを使用します。たとえば、インライン化を無効にし、入力がない関数 foo の MEX 関数を生成するには、次のように入力します。

codegen  -O disable:inline foo

詳細は、codegen の説明を参照してください。

個別の関数のインライン化を無効にする方法-  個別の MATLAB 関数のインライン化を無効にするには、命令 coder.inline('never'); をソース MATLAB ファイル内の関数シグネチャの後の別の行に追加します。

function y = foo(u,v) %#codegen
coder.inline('never');
s = single(u);
d = double(v);
y = double(identity(s)) + identity(d);

codegen はエントリポイント関数をインライン化しません。

coder.inline 命令は、命令が配置された関数のみに適用されます。この例では、インライン化は関数 foo に対して無効にされますが、別の MATLAB ファイルで定義され、foo により呼び出される最上位の関数である identity に対しては無効にされません。identity のインライン化を無効にするには、この命令をソース ファイル identity.m 内の関数シグネチャの後に追加する必要があります。詳細については、coder.inline を参照してください。

両方の関数のインライン化をより効率的に無効にする方法の詳細は、コマンド ラインでインライン化をグローバルに無効にする方法を参照してください。

C/C++ コードとインライン化された関数の相関

生成した C/C++ コードと元のインライン化された関数を相関するには、MATLAB コード内にコメントを追加して関数を特定します。これらのコメントは C/C++ コード内に配置され、生成したコードと元の MATLAB 関数のマッピングを支援します。

インライン化しきい値の変更

インライン化動作を変更するには、インライン化しきい値パラメーターを調節します。

MATLAB Coder アプリを使用したインライン化しきい値の変更

  1. [生成] ダイアログ ボックスを開くために、[コード生成] ページの [生成] 矢印 をクリックします。

  2. [詳細設定] をクリックします。

  3. [すべての設定] タブの [関数のインライン化] の下で、[インラインしきい値] パラメーターの値を設定します。

コマンド ラインでのインライン化しきい値の変更-  構成オブジェクトの InlineThreshold パラメーター の値を設定します。coder.MexCodeConfigcoder.CodeConfigcoder.EmbeddedCodeConfig を参照してください。