主要内容

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

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

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

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

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

チュートリアル ファイル

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

拷贝文件(fullfile (matlabroot,“帮助”“工具箱”“编码器”“例子”“欧几里得”))
ローカルの作業フォルダーを 私有的フォルダーまたは @ フォルダーにすることはできません。このチュートリアルで使用するファイルは、euclidean_data.mateuclidean.m,およびtest.mです。

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

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

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

  • MATLABファイルeuclidean.mには、この例の"コア アルゴリズム" を実装する関数欧几里得が含まれています。この関数は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(:,指数));如果距离(1)= D;idx(1) =指数;结束如果D >距离(2)距离(2)= D;idx(2) =指数;结束结束%输出最小和最大距离向量y_min = cb (:, idx (1));y_max = cb (:, idx (2));结束
  • MATLABスクリプトtest.mは,データファイルeuclidean_data.matをワークスペースに読み込みます。その後、関数欧几里得を呼び出してy_min尤马克斯idx,および距离を計算します。このスクリプトで計算された量がコマンドラインに表示されます。

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

    负载试验数据负载euclidean_data.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 ([“到最远点的距离是”num2str(距离(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エディターで,euclidean.mを開きます。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関数です。現在のフォルダーに既定の名前euclidean.prjをもつプロジェクトが作成されます。

  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 / c++の間でコード生成を切り替える際は,選択に応じて該当する設定を確認します。

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

    MATLAB编码器は、スタンドアロンの Cスタティック ライブラリ欧几里得工作\codegen\lib\euclideanに生成します。工作はチュートリアルファイルが含まれているフォルダーです。MATLAB编码器アプリではコード生成に成功したことが示されます。ページの左側に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])

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

    const双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コードの生成

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

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

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

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

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

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

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

  2. 入力の型の指定をクリックして編集します。:プレフィックスを使用して,指定された制限までの可変サイズを指定できます。たとえば,:3は,対応する次元が最大3.までの可変サイズであることを意味します。xの型を双(:3 * 1)cbの型を双(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_数据y_min_data,およびy_最大值_数据は,元のMATLAB関数の入力引数xcbおよび出力引数y_min尤马克斯に対応します。これで、x_datacb_数据y_min_data,およびy_最大值_数据のサイズを実行時に指定する 4.つの追加の入力引数x_sizecb_尺寸y_min_size,およびy_max_sizeを C関数が受け入れるようになります。

次のステップ

目的 詳細

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

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

c++コードを生成する

C++コード生成

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

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

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

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

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

最適化手法

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

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

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

コード生成レポート

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