Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MATLAB Coder アプリを使用した C コードの生成

このチュートリアルでは、MATLAB® Coder™ アプリを使用して、MATLAB 関数の静的な C ライブラリを生成します。最初に、固定の既定サイズの入力のみを受け入れる C コードを生成します。その後、複数の異なるサイズの入力を受け入れる C コードを生成します。

コードは MATLAB コマンド ラインで codegen コマンドを使用して生成することもできます。このワークフローのチュートリアルについては、コマンド ラインでの C コードの生成を参照してください。

MATLAB Coder アプリは、MATLAB Online™ でサポートされていません。MATLAB Online で C/C++ コードを生成するには、codegen コマンドを使用します。

チュートリアル ファイル: ユークリッド距離

この例を開いて、このチュートリアルのファイルを取得します。

チュートリアル ファイルの説明

このチュートリアルで使用するファイルは、euclidean_data.mateuclidean.m、および test.m です。

  • MATLAB データ ファイル euclidean_data.mat には、3 次元ユークリッド空間の単一の点と 3 次元ユークリッド空間の他の複数の点の 2 つのデータが格納されています。具体的には次のとおりです。

    • x は、3 次元ユークリッド空間の点を表す 31 列の列ベクトルです。

    • cb は、3216 列の配列です。cb の各列が 3 次元ユークリッド空間の点を表します。

  • MATLAB ファイル euclidean.m には、この例の "コア アルゴリズム" を実装する関数 euclidean が含まれています。この関数は xcb を入力として受け取ります。xcb の各点の間のユークリッド距離を計算して次の量を返します。

    • 列ベクトル y_minx に最も近い点を表す cb の列と等しくなります。

    • 列ベクトル y_maxx から最も遠い点を表す cb の列と等しくなります。

    • 2 次元のベクトル idx。ベクトル y_miny_maxcb における列インデックスが格納されます。

    • 2 次元のベクトル distancex との間の計算された最短距離と最長距離が格納されます。

    function [y_min,y_max,idx,distance] = euclidean(x,cb)
    % Initialize minimum distance as distance to first element of cb
    % Initialize maximum distance as distance to first element of cb
    idx(1)=1;
    idx(2)=1;
    
    distance(1)=norm(x-cb(:,1));
    distance(2)=norm(x-cb(:,1));
    
    % Find the vector in cb with minimum distance to x
    % Find the vector in cb with maximum distance to x
    for index=2:size(cb,2)
        d=norm(x-cb(:,index));
        if d < distance(1)
            distance(1)=d;
            idx(1)=index;
        end
        if d > distance(2)
            distance(2)=d;
            idx(2)=index;
        end
    end
    
    % Output the minimum and maximum distance vectors
    y_min=cb(:,idx(1));
    y_max=cb(:,idx(2));
    
    end
  • MATLAB スクリプト test.m は、データ ファイル euclidean_data.mat をワークスペースに読み込みます。その後、関数 euclidean を呼び出して y_miny_maxidx、および distance を計算します。このスクリプトで計算された量がコマンド ラインに表示されます。

    euclidean_data.mat の読み込みは、コア アルゴリズムを呼び出す前に実行される事前処理のステップです。結果の表示は事後処理のステップとなります。

    % Load test data 
    load euclidean_data.mat
    
    % Determine closest and farthest points and corresponding distances
    [y_min,y_max,idx,distance] = euclidean(x,cb);
    
    % Display output for the closest point
    disp('Coordinates of the closest point are: ');
    disp(num2str(y_min'));
    disp(['Index of the closest point is ', num2str(idx(1))]);
    disp(['Distance to the closest point is ', num2str(distance(1))]);
    
    disp(newline);
    
    % Display output for the farthest point
    disp('Coordinates of the farthest point are: ');
    disp(num2str(y_max'));
    disp(['Index of the farthest point is ', num2str(idx(2))]);
    disp(['Distance to the farthest point is ', num2str(distance(2))]);

ヒント

MATLAB 関数からのコードの生成には、MATLAB Coder を使用します。MATLAB スクリプトからのコード生成はサポートされていません。

テスト スクリプトを使用して、コア アルゴリズムを実装する関数から事前処理と事後処理のステップを分割します。こうすることで、アルゴリズムを簡単に再利用できます。ここでは、コア アルゴリズムを実装する MATLAB 関数のコードを生成します。テスト スクリプトのコードは生成しません。

MATLAB 関数の C コードの生成

元の MATLAB コードの実行

MATLAB でテスト スクリプト test.m を実行します。yidx、および distance が出力に表示されます。

Coordinates of the closest point are: 
0.8         0.8         0.4
Index of the closest point is 171
Distance to the closest point is 0.080374


Coordinates of the farthest point are: 
0  0  1
Index of the farthest point is 6
Distance to the farthest point is 1.2923

MATLAB コードをコード生成に適したものにする

MATLAB エディターのコード アナライザーは、コードの入力時にそれを常にチェックします。コード アナライザーは、コードの問題を報告し、パフォーマンスと保守性を最大化するための修正方法を提案します。

  1. MATLAB エディターで、euclidean.m を開きます。MATLAB エディターの右上隅にあるコード アナライザー メッセージ インジケーターは緑色になります。アナライザーは、コード内にエラー、警告または改善すべき点を検出しませんでした。

  2. 関数宣言の後に、%#codegen 命令を追加します。

    function [y,idx,distance] = euclidean(x,cb) %#codegen
    %#codegen 命令により、コード生成に固有の警告やエラーがコード アナライザーで特定されます。

    コード アナライザー メッセージ インジケーターが赤色になり、コード生成の問題が検出されたことが示されます。

  3. 警告メッセージを表示するには、下線が引かれているコード部分にカーソルを移動します。この警告は、コードを生成するには、変数 idxdistance を完全に定義してから添字を付けなければならないことを示しています。これらの警告が発生するのは、コード ジェネレーターがそれらの変数のサイズをコードにおける最初の出現箇所で決定しなければならないためです。この問題を修正するには、関数 ones を使用して、それらの配列の割り当てと初期化を同時に行います。

    % Initialize minimum distance as distance to first element of cb
    % Initialize maximum distance as distance to first element of cb
    idx = ones(1,2);
    
    distance = ones(1,2)*norm(x-cb(:,1));

    コード アナライザー メッセージ インジケーターが再び緑色になり、コード生成に関する問題がほかに検出されていないことが示されます。

    コード アナライザーの使用の詳細については、コード アナライザーを使用したエラーと警告についてのコードのチェックを参照してください。

  4. ファイルを保存します。

    これで、MATLAB Coder アプリを使用してコードをコンパイルする準備ができました。"コンパイル" とは、ここでは MATLAB コードから C/C++ コードを生成することを指しています。

メモ

MATLAB コードのコンパイルとは、MATLAB コードから C/C++ コードを生成することを指します。他のコンテキストでは、コンパイルという用語が C/C++ コンパイラのアクションを指す場合もあります。

MATLAB Coder アプリを開いてソース ファイルを選択

  1. MATLAB ツールストリップの [アプリ] タブの [コード生成] の下で、MATLAB Coder アプリ アイコンをクリックします。[ソース ファイルの選択] ページが開きます。

  2. [ソース ファイルの選択] ページで、エントリポイント関数 euclidean の名前を入力するか選択します。"エントリポイント関数" は、コードを生成する最上位の MATLAB 関数です。現在のフォルダーに既定の名前 euclidean.prj をもつプロジェクトが作成されます。

  3. [次へ] をクリックして [入力の型を定義] ステップに進みます。エントリポイント関数について、アプリでコード アナライザー (前の手順で実行済み) とコード生成の準備状態ツールが実行されます。コード生成の準備状態ツールでは、MATLAB コード内にコード生成でサポートされない機能や関数がないかどうかを調べることができます。問題が検出された場合は、[コード生成の準備状態の確認] ページが開くので、ここで問題を確認して修正できます。この例では問題は検出されないので、[入力の型を定義] ページが表示されます。詳細については、コード生成の準備状態ツールを参照してください。

    メモ

    コード アナライザーとコード生成の準備状態ツールで、コード生成に関するすべての問題を検出できるわけではありません。これらの 2 つのツールで検出されたエラーや警告を解決したら、MATLAB Coder でコードを生成し、MATLAB コードに準拠違反の問題がほかにないかどうかを調べてください。

C/C++ コード生成でサポートされる MATLAB の一部の組み込み関数とツールボックス関数、クラス、および System object には、特定のコード生成の制限があります。それらの制限と関連する使用上の注意事項については、該当するリファレンス ページの拡張機能のセクションに記載されています。詳細については、C/C++ コードの生成でサポートされている関数およびオブジェクトを参照してください。

入力の型の定義

C では静的なデータ型が使用されるため、コード ジェネレーターは MATLAB ファイル内のすべての変数のクラス、サイズ、実数/複素数をコード生成時 ("コンパイル時") に判別しなければなりません。したがって、エントリポイント関数に対するすべての入力のプロパティを指定しなければなりません。入力のプロパティを指定するために、次の操作が可能です。

  • エントリポイント関数を呼び出すスクリプトとサンプル入力を指定して、入力のプロパティをアプリで自動的に決定するように指示します。

  • プロパティを直接指定します。

この例では、入力 xcb のプロパティを定義するために、コード ジェネレーターが型を自動的に定義するために使用できるテスト ファイル test.m を指定します。

  1. テスト ファイル test.m を入力または選択します。

  2. [入力の型の自動定義] をクリックします。

    テスト ファイル test.m では、想定された入力の型を用いてエントリポイント関数 euclidean を呼び出します。アプリは、入力 xdouble(3x1)、入力 cbdouble(3x216) であると判別します。

  3. [次へ] をクリックして [実行時の問題の確認] ステップに進みます。

実行時の問題の確認

[実行時の問題の確認] ステップでは、エントリポイント関数からの MEX ファイルの生成、MEX 関数の実行および問題の報告が行われます。MEX 関数は MATLAB 内から呼び出すことができる生成コードです。生成された C コードでの診断が難しいランタイム エラーを検出して修正することができるため、このステップを実行することをお勧めします。既定では、MEX 関数にはメモリ整合性チェックが含まれます。このチェックにより、配列の範囲と次元のチェックが実行されます。このチェックを実行することにより、MATLAB 関数に対して生成されたコード内のメモリ整合性の違反が検出されます。詳細は、実行時チェックの制御を参照してください。

MATLAB コードを効率良く動作する C/C++ ソース コードに変換するためにコード ジェネレーターによって行われる最適化により、特定の状況において、元のソース コードと生成後のコードで異なる動作になることがあります。生成されたコードと MATLAB コードの相違点を参照してください。

  1. [実行時の問題の確認] ダイアログ ボックスを開くために [問題の確認] 矢印 をクリックします。

  2. [実行時の問題の確認] ダイアログ ボックスで、テスト ファイルを指定するか、入力の例と共にエントリポイント関数を呼び出すコードを入力します。この例では、入力の型を定義するために使用したテスト ファイル test を使用します。

  3. [問題の確認] をクリックします。

    アプリにより MEX 関数が生成されます。euclidean の呼び出しを生成された MEX の呼び出しで置き換えたうえで、テスト スクリプト test が実行されます。MEX 関数の生成または実行中に問題が検出された場合は、警告およびエラー メッセージが表示されます。これらのメッセージをクリックして問題のあるコードに移動し、問題を修正します。この例ではアプリは問題を検出しません。

  4. 既定で、行の実行回数が収集されます。これらの回数は、テスト ファイル test.m が関数 euclidean に対してどのように実施されているかを知るために役立ちます。行の実行回数を表示するには、[MATLAB 行の実行回数の表示] をクリックします。アプリのエディターで、コードの左側に色分けされたバーが表示されます。強調表示の色をコードに適用して行の実行回数を確認するには、バーの上にカーソルを合わせます。

    この階調の緑色は、このコードの行の実行回数が特定の範囲内にあることを示します。この例では、for ループが 215 回実行されています。行の実行回数を解釈する方法と回数の収集をオフにする方法の詳細については、MATLAB コードの行の実行回数の収集および表示を参照してください。

  5. [次へ] をクリックして [コード生成] ステップに進みます。

メモ

MATLAB コードからスタンドアロン C/C++ コードを生成する前に、MEX 関数を生成します。生成された MEX 関数を実行して、実行時の動作が MATLAB 関数と同じであることを確認します。生成された MEX 関数の応答が MATLAB とは異なる場合、またはエラーが発生する場合は、スタンドアロン コード生成に進む前にこれらの問題を解決しなければなりません。そうしないと、生成するスタンドアロン コードの信頼性が低くなり、未定義の動作が発生する可能性があります。

C コードの生成

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

  2. [生成] ダイアログ ボックスで [ビルド タイプ][スタティック ライブラリ (.lib)] に、[言語] を [C] に設定します。プロジェクトの他のビルド構成設定には既定値を使用します。

    C スタティック ライブラリを生成する代わりに、MEX 関数や他の C/C++ ビルド タイプを生成するように選択することもできます。使用できるプロジェクト設定は MEX や C/C++ ビルド タイプに応じて異なります。MEX と C/C++ の間でコード生成を切り替える際は、選択に応じて該当する設定を確認します。

  3. [生成] をクリックします。

    MATLAB Coder は、スタンドアロンの C スタティック ライブラリ euclideanwork\codegen\lib\euclidean に生成します。work はチュートリアル ファイルが含まれているフォルダーです。MATLAB Coder アプリではコード生成に成功したことが示されます。ページの左側に MATLAB のソース ファイルと生成された出力ファイルが表示されます。[変数] タブに MATLAB ソースの変数についての情報が表示されます。[ターゲットのビルド ログ] タブに C/C++ コンパイラの警告とエラーを含むビルド ログが表示されます。既定では、コード ウィンドウに C のソース コード ファイル euclidean.c が表示されます。他のファイルを表示するには、[ソース コード] ペインまたは [出力ファイル] ペインでファイル名をクリックします。

  4. [レポートの表示] をクリックして、レポート ビューアーでレポートを表示します。コード生成中にコード ジェネレーターでエラーや警告が検出された場合は、レポートに問題の説明と問題がある MATLAB コードへのリンクが表示されます。詳細については、コード生成レポートを参照してください。

  5. [次へ] をクリックして [ワークフローの完了] ページを開きます。

[ワークフローの完了] ページの確認

[ワークフローの完了] ページには、コード生成に成功したことが示されます。このページにはプロジェクトのサマリーと生成された出力へのリンクが表示されます。

生成された C コードと元の MATLAB コードとの比較

生成された C コードと元の MATLAB コードを比較するには、C ファイル euclidean.ceuclidean.m ファイルを MATLAB エディターで開きます。

生成された C コードに関する重要な情報を次に示します。

  • 関数シグネチャは次のようになります。

    void euclidean(const double x[3], const double cb[648], double y_min[3], double
                   y_max[3], double idx[2], double distance[2])

    const double x[3] は MATLAB コード内の入力 x に対応します。x のサイズは 3 で、これは MATLAB コードからコードを生成したときに使用したサンプル入力の合計サイズ (3 行 1 列) に対応します。

    const double cb[648] は MATLAB コード内の入力 cb に対応します。cb のサイズは 648 で、これは MATLAB コードからコードを生成したときに使用したサンプル入力の合計サイズ (3 行 216 列) に対応します。この例の生成されたコードでは、1 次元配列を使用して MATLAB コードの 2 次元配列を表します。

    生成されたコードには、4 つの追加の入力引数があります。配列 y_miny_maxidx、および distance です。これらの配列は出力値を返すために使用されます。これらは、元の MATLAB コードの出力引数 y_miny_maxidx、および distance に対応します。

  • コード ジェネレーターでは関数名とコメントが保持されます。変数名については、可能であればコード ジェネレーターで保持されます。

    メモ

    MATLAB コード内の変数が定数値に設定された場合、生成された C コード内では変数としては表れません。生成された C コード内では、変数の実際の値が含まれています。

Embedded Coder® では、MATLAB コードと生成された C/C++ コードを対話形式でトレースできます。Interactively Trace Between MATLAB Code and Generated C/C++ Code (Embedded Coder)を参照してください。

可変サイズ入力の C コードの生成

生成した euclidean.m の C 関数は、コード生成時に指定したサンプル入力と同じサイズの入力のみを受け入れます。ただし、対応する MATLAB 関数への入力配列は任意のサイズにすることができます。チュートリアルのこのパートでは、可変サイズの入力を受け入れる C コードを euclidean.m から生成します。

ここでは、生成される C コードの xcb の次元について、プロパティを次のように設定するとします。

  • xcb の両方の最初の次元を最大サイズ 3 の可変にします。

  • x の 2 番目の次元を値 1 の固定にします。

  • cb の 2 番目の次元を最大サイズ 216 の可変にします。

これらの入力プロパティを指定するには、次のようにします。

  1. [入力の型を定義] ステップで、前と同様に、テスト ファイル test.m を入力して [入力の型の自動定義] をクリックします。テスト ファイルでは、想定された入力の型を用いてエントリポイント関数 euclidean.m を呼び出します。アプリは、入力 xdouble(3x1)、入力 cbdouble(3x216) であると判別します。これらの型では固定サイズの入力が指定されています。

  2. 入力の型の指定をクリックして編集します。: プレフィックスを使用して、指定された制限までの可変サイズを指定できます。たとえば、:3 は、対応する次元が最大 3 までの可変サイズであることを意味します。x の型を double(:3 x 1)cb の型を double(:3 x :216) に変更します。

次に、前と同じ手順でコードを生成できます。euclidean.c の生成された C コードの関数シグネチャは次のようになります。

void euclidean(const double x_data[], const int x_size[1], const double cb_data[],
               const int cb_size[2], double y_min_data[], int y_min_size[1],
               double y_max_data[], int y_max_size[1], double idx[2], double
               distance[2])
引数 x_datacb_datay_min_data、および y_max_data は、元の MATLAB 関数の入力引数 xcb および出力引数 y_miny_max に対応します。これで、x_datacb_datay_min_data、および y_max_data のサイズを実行時に指定する 4 つの追加の入力引数 x_sizecb_sizey_min_size、および y_max_size を C 関数が受け入れるようになります。

次のステップ

目的詳細

コード生成でサポートされる MATLAB の組み込み関数とツールボックス関数、クラス、および System object について学習する

C/C++ コードの生成でサポートされている関数およびオブジェクト

C++ コードを生成する

C++ コード生成

C main 関数の例を生成および変更して C 実行可能プログラムの ビルドに使用する

アプリケーションにおける C の main の例の使用

生成されたファイルを圧縮ファイルにパッケージ化する

他の開発環境向けのコードのパッケージ化

生成されたコードの実行速度またはメモリ使用量を最適化する

最適化手法

カスタムの C/C++ コードを生成コードに統合する

生成コードからのカスタム C/C++ コードの呼び出し

コード生成レポートについて学習する

コード生成レポート

Interactively Trace Between MATLAB Code and Generated C/C++ Code (Embedded Coder)