主要内容

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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

このチュートリアルでは、MATLAB®编码员™アプリを使用して,MATLAB关数の静的なÇライブラリを生成します。最初に,固定の既定サイズの入力のみを受け入れるÇコードを生成します。その后,复数の异なるサイズの入力を受け入れるÇコードを生成します。

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

MATLAB编码器アプリは、MATLAB在线™でサポートされていません。MATLAB在线で C/C++コードを生成するには、编码基因コマンドを使用します。

チュートリアル ファイル

チュートリアル ファイルをフォルダー草根\帮助\工具箱\编码器\示例\欧几里德からローカルの作业フォルダーにコピーします。ここで,草根はMATLABのインストールフォルダーです(例:C:\Program Files\MATLAB\R2019a)。これらのファイルを現在のフォルダーにコピーするには、次の MATLABコマンドを実行します。

copyfile(完整文件)(matlabroot,“救命”,“工具箱”,“编码员”,'例子',“欧几里得”))
ローカルの作業フォルダーを 私有的フォルダーまたは @ フォルダーにすることはできません。このチュートリアルで使用するファイルは、欧几里得数据.mat欧几里德、およびtest.mです。

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

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

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

  • MATLABファイル欧几里德には、この例の"コア アルゴリズム" を実装する関数欧几里得が含まれています。この関数はxcbを入力として受け取ります。xcbの各点の间のユークリッド距离を计算して次の量を返します。

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

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

    • 2.次元のベクトルidx。ベクトルY_MIN尤马克斯cbにおける列インデックスが格納されます。

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

    作用[y_min,y_max,idx,距离]=欧几里德(x,cb)%将最小距离初始化为到cb第一个元素的距离%将最大距离初始化为到cb第一个元素的距离idx(1)=1;idx(2)=1;距离(1)=范数(x-cb(:,1));距离(2)=范数(x-cb(:,1));%在cb中找到距离x最小的向量%在cb中找到距离x最大的向量对于索引= 2:尺寸(CB,2)d =范数(X-CB(:,索引));如果d<距离(1)距离(1)=d;idx(1)=指数;终止如果d>距离(2)距离(2)=d;idx(2)=指数;终止终止%输出最小和最大距离向量y_min=cb(:,idx(1));y_max=cb(:,idx(2));终止
  • MATLABスクリプトtest.mは、データ ファイル欧几里得数据.matをワークスペースに読み込みます。その後、関数欧几里得を呼び出してY_MIN尤马克斯idx、および距离を计算します。このスクリプトで计算された量がコマンドラインに表示されます。

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

    %负载测试数据负载欧几里得数据.mat%确定最近点和最远点以及相应的距离[Y_MIN,Y_MAX,IDX,距离] =欧几里德(X,CB);%显示最近点的输出DISP('最近点的坐标为:');DISP(num2str(Y_MIN'));DISP(['最近点的索引为',num2str(idx(1)));disp([“到最近点的距离为”,num2str(距离(1))]);DISP(换行);%显示输出的最远点DISP('最远点的坐标为:');disp(num2str(y_max');disp([“最远点的指数是”,num2str(idx(2)));disp(['到最远点的距离为'距离(2))];

ヒント

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

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

MATLAB関数の Cコードの生成

元のMATLABコードの実行

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

最近点的坐标为:0.8 0.8 0.4最近点的索引为171到最近点的距离为0.080374最远点的坐标为:0 0 1最远点的索引为6到最远点的距离为1.2923

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

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

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

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

    作用[Y,IDX,距离] =欧几里德(X,CB)%#编码基因
    %#编码基因命令により,コード生成に固有の警告やエラーがコードアナライザーで特定されます。

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

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

    %将最小距离初始化为到cb第一个元素的距离%将最大距离初始化为到cb第一个元素的距离idx=一(1,2);距离=一(1,2)*范数(x-cb(:,1));

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

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

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

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

メモ

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

MATLAB编码器アプリを开いてソースファイルを选択

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

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

  3. [次へ]をクリックして[入力の型を定義]ステップに进みます。エントリポイント关数について,アプリでコードアナライザー(前の手顺で実行済み)とコード生成の准备状态ツールが実行されます。コード生成の准备状态ツールでは,MATLABコード内にコード生成でサポートされない机能や关数がないかどうかを调べることができます。问题が検出された场合は,[コード生成の準備状態の確認]ページが开くので,ここで问题を确认して修正できます。この例では问题は検出されないので,[入力の型を定義]ページが表示されます。详细については,コード生成の準備状態ツールを参照してください。

    メモ

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

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

入力の型の定義

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

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

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

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

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

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

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

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

実行时の问题の确认

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

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

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

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

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

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

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

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

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

メモ

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

Cコードの生成

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

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

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

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

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

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

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

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

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

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

生成されたÇコードと元のMATLABコードを比较するには,Cファイル欧几里德欧几里德ファイルをMATLABエディターで开きます。

生成されたÇコードに关する重要な情报を次に示します。

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

    空隙欧几里德(常量双X [3],常量双CB [648],双Y_MIN [3],双Y_MAX [3],双IDX [2],双距离[2])

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

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

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

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

    メモ

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

嵌入式编码器®では、MATLABコードと生成された C/C++コードを対話形式でトレースできます。MATLAB代码与生成的C/C++代码的交互跟踪(嵌入式编码器)を参照してください。

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

生成した欧几里德のÇ关数は,コード生成时に指定したサンプル入力と同じサイズの入力のみを受け入れます。ただし,対応するMATLAB关数への入力配列は任意のサイズにすることができます。チュートリアルのこのパートでは,可変サイズの入力を受け入れるçコードを欧几里德から生成します。

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

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

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

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

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

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

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

次に、前と同じ手順でコードを生成できます。欧几里德の生成されたÇコードの关数シグネチャは次のようになります。

无效欧几里德(常数双x_数据[],常数整数x_大小[1],常数双cb_数据[],常数整数cb_大小[2],双y_最小值数据[],整数y_最小值大小[1],双y_最大值数据[],整数y_最大值大小[1],双idx[2],双距离[2])
引数x_数据cb_数据y_min_数据、およびy_最大值_数据は、元の MATLAB関数の入力引数xcbおよび出力引数Y_MIN尤马克斯に対応します。これで、x_数据cb_数据y_min_数据、およびy_最大值_数据のサイズを実行時に指定する 4.つの追加の入力引数x_尺寸cb_尺寸y_最小尺寸、およびy_max_sizeを C関数が受け入れるようになります。

次のステップ

目的 詳細

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

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

C++コードを生成する

C++コード生成

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

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

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

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

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

最適化手法

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

MATLABコードからの C/C++コードの呼び出し

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

コード生成レポート

MATLAB代码与生成的C/C++代码的交互跟踪(嵌入式编码器)