主要内容

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

コマンドラ@ @ンでの@ @ c @ @コ@ @ドの生成

このチュ,トリアルでは,MATLAB®编码器™codegenコマンドを使用して,matlab関数の静的なcラescブラリを生成します。最初に,固定の既定サe e e e e e e e e e e e e e e e e e e e e e e e e e eその後,複数の異なるサe e e e e e e e e e e e e e e e e e e e e e e e e e e

コドはMATLAB编码器アプリを使用して生成することもできます。このワクフロのチュトリアルにいては,MATLAB编码器アプリを使用したCコ,ドの生成を参照してください。

チュトリアルファル

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

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

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

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

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

  • Matlabファescルeuclidean.mには,この例の“コアアルゴリズム”を実装する関数欧几里得が含まれています。この関数はxcbを入力として受け取ります。xcbの各点の間のユ,クリッド距離を計算して次の量を返します。

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

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

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

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

    函数[y_min,y_max,idx,distance] = euclidean(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 < distance(1) distance(1)= D;idx(1) =指数;结束如果D > distance(2) distance(2)= D;idx(2) =指数;结束结束输出最小和最大距离向量y_min = cb (:, idx (1));y_max = cb (:, idx (2));结束
  • Matlabスクリプトtest.mは,デ,タファ,ルeuclidean_data.matをワ,クスペ,スに読み込みます。その後,関数欧几里得を呼び出してy_miny_maxidx,および距离を計算します。このスクリプトで計算された量がコマンドラ@ @ンに表示されます。

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

    负载测试数据负载euclidean_data.mat确定最近点和最远点以及相应的距离[y_min,y_max,idx,distance] = euclidean(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))));
  • ビルドスクリプトbuild_lib_fixed.mbuild_lib_variable.mには,MATLABコードから静的なCライブラリを生成するためのコマンドが固定サイズの入力を受け入れるものと可変サイズの入力を受け入れるものに分けて格納されています。これらのスクリプトの内容については,このチュートリアルの後半でCコードを生成するときに説明します。

ヒント

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コードをコード生成に適したものにするには,コードアナライザーとコード生成の準備状態ツールを使用します。Matlabエディタのコドアナラザは,コドの入力時にそれを常にチェックします。コードアナライザーは,コードの問題を報告し,パフォーマンスと保守性を最大化するための修正方法を提案します。コド生成の準備状態ルでは、MATLAB コード内にコード生成でサポートされない機能や関数がないかどうかを調べることができます。

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

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

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

    函数[y,idx,distance] =欧几里得(x,cb)% # codegen
    % # codegen命令により,コド生成に固有の警告やエラがコドアナラザで特定されます。

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

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

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

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

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

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

  5. コド生成の準備状態ルを実行するには,matlabコマンドランから関数coder.screenerを呼び出します。

    coder.screener (“欧几里得”

    欧几里得にいては,。詳細にいては,コド生成の準備状態ルを参照してください。

    コ,ド生成の準備状態,,ルは,MATLAB在线™ではサポ,トされていません。

    メモ

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

これで,MATLAB编码器アプリを使用してコドをコンパルする準備ができました。“コンパ电子邮箱ル”とは,ここではmatlabコ,ドからc / c++コ,ドを生成することを指しています。

メモ

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

入力の型の定義

Cでは静的なデータ型が使用されるため,コードジェネレーターはMATLABファイル内のすべての変数のクラス,サイズ,実数/複素数をコード生成時(“コンパaapl . exeル時”)に判別しなければなりません。したがって,ファイルのコードを生成するときに,エントリポイント関数に対するすべての入力引数のプロパティを指定しなければなりません。“エントリポ电子邮箱ント関数”は,コ,ドを生成する最上位のmatlab関数です。

codegenコマンドを使用してコ,ドを生成する場合は,arg游戏オプションを使用してエントリポント関数に対するサンプル入力パラメタを指定します。コ,ドジェネレ,タ,は,この情報を使用して入力引数のプロパティを決定します。

次のステップでは,codegenコマンドを使用して,エントリポ欧几里得からmexファ超市ルを生成します。

実行時の問題の確認

エントリポ▪▪▪▪ント関数から▪▪▪関数を生成します。Mex関数はmatlab内から呼び出すことができる生成コ,ドです。墨西哥人関数を実行し,生成された墨西哥人関数と元のMATLAB関数が同じように機能するかどうかを確認します。

生成されたCコードでの診断が難しいランタイムエラーを検出して修正することができるため,このステップを実行することをお勧めします。既定では,mex関数にはメモリ整合性チェックが含まれます。このチェックにより,配列の範囲と次元のチェックが実行されます。このチェックを実行することにより,MATLAB関数に対して生成されたコード内のメモリ整合性の違反が検出されます。詳細は,実行時チェックの制御を参照してください。

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

  1. codegenコマンドを使用してeuclidean.mのmexファ超市ルを生成します。Mex関数を検証するには,matlab関数欧几里得の呼び出しを生成されたmex関数の呼び出しに置き換えてテストスクリプト测验を実行します。

    codegeneuclidean.marg游戏{x, cb}以及测验

    • 既定で,codegenは,現在のフォルダ,にeuclidean_mexという名前のmex関数を生成します。

    • arg游戏オプションを使用して,エントリポ欧几里得に対するサンプル入力パラメ,タ,を指定します。コ,ドジェネレ,タ,は,この情報を使用して入力引数のプロパティを決定します。

    • 以及オプションを使用して,テストファtest.mを実行します。このオプションにより,テストファ欧几里得の呼び出しがeuclidean_mexの呼び出しに置き換えられます。

    出力は,次のようになります。

    运行测试文件:'test',带有MEX函数'euclidean_mex'。最近点的坐标为:0.8 0.8 0.4最近点的指数为171最近点的距离为0.080374最远点的坐标为:0 0 1最远点的指数为6到最远点的距离为1.2923
    この出力が元のmatlab関数で生成された出力と一致することから,mex関数を確認できます。これで,欧几里得のスタンドアロンのcコ,ドを生成する準備ができました。

メモ

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

Cコ,ドの生成

ビルドスクリプトbuild_lib_fixed.meuclidean.mのコ,ドの生成に使用するコマンドが含まれています。

加载测试数据负载euclidean_data.mat生成欧几里得代码。M和密码原。使用测试数据作为示例输入。codegen报告配置:自由euclidean.marg游戏{x, cb}
次の点に注意してください。

  • codegenは,ファeuclidean.mを読み取り,matlabコ,ドをcコ,ドに変換します。

  • 报告オプションはcodegenに対して,コード生成の問題をデバッグしたりMATLABコードがコード生成に適していることを確認したりするために使用できるコード生成レポートを生成するよう指示します。

  • 配置:自由オプションはcodegenに対して,既定のmex関数を生成するのではなく静的なcラescブラリを生成するよう指示します。

  • arg游戏オプションはcodegenに対して,サンプル入力パラメ,タ,xcbのクラス,サ▪▪▪ズ,実数/複素数を使用してeuclidean.mのコ,ドを生成するよう指示します。

codegenコマンドで適切なオプションを使用することで,Cスタティックライブラリを生成する代わりに,墨西哥人関数や他のC / c++ビルドタイプを生成するように選択することもできます。各種のコド生成オプションの詳細にいては,codegenを参照してください。

  1. ビルドスクリプトを実行します。

    Matlabはビルドファ@ @ルを処理し,メッセ@ @ジを出力します。

    代码生成成功:查看报告。
    コドジェネレタにより,スタンドアロンのcスタティックラブラリ欧几里得工作\ codegen \ lib \欧几里得に生成されます。ここで,工作はチュトリアルファルが含まれているフォルダです。

  2. レポ,トビュ,ア,でコ,ド生成レポ,トを表示するには,[レポ,トの表示]をクリックします。

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

ヒント

コマンドラ▪▪ンでのコ▪▪ドの生成にはビルドスクリプトを使用します。ビルドスクリプトでは、コマンド ラインで繰り返し実行する一連の MATLAB コマンドを自動化できるため、時間の節約となり、入力エラーをなくすことができます。

生成された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コードをコンパイルしたときに使用したサンプル入力の合計サイズ(216列3行)に対応します。この例の生成されたコードでは,1次元配列を使用してMATLABコードの2次元配列を表します。

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

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

    メモ

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

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

可変サ@ @ズ入力の@ @ c @ @コ@ @ドの生成

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

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

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

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

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

これらの入力プロパティを指定するには,関数coder.typeofを使用します。coder.typeof (A, B, 1)は,クラスと実数/複素数が一个と同じで,上限がサBの対応する要素で与えられる可変サ@ @ズの入力を指定します。coder.typeofを使用するビルドスクリプトbuild_lib_variable.mを使用して,生成されるcラ。

加载测试数据负载euclidean_data.mat%使用编码器。Typeof指定可变大小的输入eg_x =编码器。typeof (x, [3 1], 1);eg_cb =编码器。typeof (cb [216], 1);生成欧几里得代码。M使用编码器。要指定的类型%示例输入的上限codegen报告配置:自由euclidean.marg游戏{eg_x, eg_cb}

次に,前と同じ手順でコ,ドを生成できます。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の組み込み関数とツールボックス関数,クラス,および系统对象について学習する

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

c++コドを生成する

c++コド生成

入力の型を対話形式で作成および編集する

コ,ド生成の型エディタ,を使用した入力の型の作成と編集

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

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

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

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

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

最適化手法

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

Matlabコ,ドからのc / c++コ,ドの呼び出し

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

コ,ド生成レポ,ト

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

参考

|