このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
MATLAB®编码器™を使用してmatlabコ,ドからmex関数を生成できます。Mex関数はmatlabの実行可能ファ计算器ルです。生成されたコドはmatlab内から呼び出すことができます。墨西哥人関数を使用すると,MATLAB環境内での作業において,MATLABコードの計算量の多い部分を高速化できます。Matlabコ,ドから,mex関数を生成するには,MATLAB编码器アプリを使用するか,matlabコマンドラescンでcodegen
を使用します。
このチュ,トリアルでは,MATLAB编码器codegen
コマンドを使用して,matlab関数のmex関数を生成します。最初に,固定の既定サaaplズの入力のみを受け入れるmex関数を生成します。その後、複数の異なるサ▪▪ズの入力を受け入れるもう1▪▪の▪▪mex▪▪関数を生成します。
チュトリアルファルをフォルダ
からロ,カルの作業フォルダ,にコピ,します。ここで,matlabroot
帮助\ \工具箱\编码器\ \欧几里得例子
はmatlabのンストルフォルダです(例:matlabroot
C:\Program Files\MATLAB\R2019a
)。これらのファルを現在のフォルダにコピするには,次のmatlabコマンドを実行します。
拷贝文件(fullfile (matlabroot,“帮助”,“工具箱”,“编码器”,“例子”,“欧几里得”))
euclidean_data.mat
、euclidean.m
、test.m
、test_2d.m
、build_mex_fixed.m
,およびbuild_mex_variable.m
です。
Matlabデタファルeuclidean_data.mat
には3次元ユークリッド空間の単一の点と3次元ユークリッド空間の他の複数の点の2つのデータが格納されています。具体的には次のとおりです。
x
は,3次元ユ,クリッド空間の点を表す3.
行1
列の列ベクトルです。
cb
は,3.
行216
列の配列です。cb
の各列が3次元ユクリッド空間の点を表します。
Matlabファescルeuclidean.m
には,この例の“コアアルゴリズム”を実装する関数欧几里得
が含まれています。この関数はx
とcb
を入力として受け取ります。x
とcb
の各点の間のユ,クリッド距離を計算して次の量を返します。
列ベクトルy_min
。x
に最も近い点を表すcb
の列と等しくなります。
列ベクトルy_max
。x
から最も遠い点を表すcb
の列と等しくなります。
2次元のベクトルidx
。ベクトルy_min
とy_max
のcb
における列@ @ンデックスが格納されます。
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_min
、y_max
、idx
,および距离
を計算します。このスクリプトで計算された量がコマンドラ@ @ンに表示されます。
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))));
Matlabスクリプトtest_2d.m
は,2次元ユ,クリッド空間の点を表すためにtest.m
を変更したものです。test_2d.m
の内容については,このチュートリアルの後半で墨西哥人関数の可変サイズ入力のテストに使用するときに説明します。
ビルドスクリプトbuild_mex_fixed.m
とbuild_mex_variable.m
には,MATLABコードから静的なCライブラリを生成するためのコマンドが固定サイズの入力を受け入れるものと可変サイズの入力を受け入れるものに分けて格納されています。これらのスクリプトの内容については,このチュートリアルの後半でCコードを生成するときに説明します。
ヒント
Matlab関数からのコ,ドの生成には,MATLAB编码器を使用します。MATLABスクリプトからのコード生成はサポートされていません。
テストスクリプトを使用して,コアアルゴリズムを実装する関数から事前処理と事後処理のステップを分割します。こうすることで,アルゴリズムを簡単に再利用できます。ここでは,コアアルゴリズムを実装するmatlab関数のコ,ドを生成します。テストスクリプトのコ,ドは生成しません。
Matlabでテストスクリプトtest.m
を実行します。y
、idx
,および距离
が出力に表示されます。
最近点的坐标为:0.8 0.8 0.4最近点的指数为171最近点的距离为0.080374最远点的坐标为:0 0 1最远点的指数为6到最远点的距离为1.2923
MATLABコードをコード生成に適したものにするには,コードアナライザーとコード生成の準備状態ツールを使用します。Matlabエディタのコドアナラザは,コドの入力時にそれを常にチェックします。コードアナライザーは,コードの問題を報告し,パフォーマンスと保守性を最大化するための修正方法を提案します。コド生成の準備状態ルでは、MATLAB コード内にコード生成でサポートされない機能や関数がないかどうかを調べることができます。
C / c++コード生成でサポートされるMATLABの一部の組み込み関数とツールボックス関数,クラス,および系统对象には,特定のコード生成の制限があります。それらの制限と関連する使用上の注意事項にいては,該当するリファレンスペジの拡張機能のセクションに記載されています。詳細にいては,C/ c++コドの生成でサポトされている関数およびオブジェクトを参照してください。
Matlabエディタ,で,euclidean.m
を開きます。MATLABエディターの右上隅にあるコード アナライザー メッセージ インジケーターは緑色になります。アナライザーは、コード内にエラー、警告または改善すべき点を検出しませんでした。
関数宣言の後に,% # codegen
命令を追加します。
函数[y,idx,distance] =欧几里得(x,cb)% # codegen
% # codegen
命令により,コド生成に固有の警告やエラがコドアナラザで特定されます。コードアナライザーメッセージインジケーターが赤色になり,コード生成の問題が検出されたことが示されます。
警告メッセ,ジを表示するには,下線が引かれているコ,ド部分にカ,ソルを移動します。この警告は,コ,ドを生成するには,変数idx
と距离
を完全に定義してから添字を付けなければならないことを示しています。この警告が発生するのは,コードジェネレーターがそれらの変数のサイズをコードにおける最初の出現箇所で決定しなければならないためです。この問題を修正するには,関数的
を使用して,それらの配列の割り当てと初期化を同時に行います。
初始化最小距离为到cb第一个元素的距离将最大距离初始化为到cb第一个元素的距离Idx = ones(1,2);距离= ones(1,2)*norm(x-cb(:,1));
コードアナライザーメッセージインジケーターが再び緑色になり,コード生成に関する問題がほかに検出されていないことが示されます。
コドアナラザの使用の詳細にいては,エラと警告にいてのコドのチェックを参照してください。
ファ@ @ルを保存します。
コド生成の準備状態ルを実行するには,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ファ超市ルを生成します。
ビルドスクリプトbuild_mex_fixed.m
にeuclidean.m
のmex関数の生成と検証に使用するコマンドが含まれています。Mex関数を検証するには,matlab関数欧几里得
の呼び出しを生成されたmex関数の呼び出しに置き換えてテストスクリプト测验
を実行します。
加载测试数据负载euclidean_data.mat生成欧几里得代码。M和密码原。使用测试数据作为示例输入。使用test.m验证MEX。codegen报告euclidean.marg游戏{x, cb}以及测验
既定で,codegen
は,現在のフォルダ,にeuclidean_mex
という名前のmex関数を生成します。
报告
オプションはcodegen
に対して,コード生成の問題をデバッグしたりMATLABコードがコード生成に適していることを確認したりするために使用できるコード生成レポートを生成するよう指示します。
arg游戏
オプションは,エントリポ欧几里得
に対するサンプル入力パラメ,タ,を指定します。コ、ドジェネレ、タ、は、この情報を使用して入力引数のクラス、サ、実数/複素数を決定します。
以及
オプションを使用して,テストファtest.m
を実行します。このオプションにより,テストファ欧几里得
の呼び出しがeuclidean_mex
の呼び出しに置き換えられます。
コド生成オプションの詳細にいては,codegen
を参照してください。
ビルドスクリプトbuild_mex_fixed.m
を実行します。
コ,ドジェネレ,タ,により,mex関数euclidean_mex
が現在の作業フォルダ,に生成されます。
出力は,次のようになります。
代码生成成功:查看报告。运行测试文件:'test',带有MEX函数'euclidean_mex'。最近点的坐标为:0.8 0.8 0.4最近点的指数为171最近点的距离为0.080374最远点的坐标为:0 0 1最远点的指数为6到最远点的距离为1.2923
レポ,トビュ,ア,でコ,ド生成レポ,トを表示するには,[レポ,トの表示]をクリックします。
コード生成中にコードジェネレーターでエラーや警告が検出された場合は,レポートに問題の説明と問題があるMATLABコードへのリンクが表示されます。コ,ド生成レポ,トを参照してください。
ヒント
コマンドラ▪▪ンでのコ▪▪ドの生成にはビルドスクリプトを使用します。ビルドスクリプトでは、コマンド ラインで繰り返し実行する一連の MATLAB コマンドを自動化できるため、時間の節約となり、入力エラーをなくすことができます。
生成したeuclidean.m
のmex関数は,コド生成時に指定したサンプル入力と同じサズの入力のみを受け入れます。ただし,対応するmatlab関数への入力配列は任意のサescズにすることができます。チュ、トリアルのこのパ、トでは、可変サ、ズの入力を受け入れる、mex関数をeuclidean.m
から生成します。
ここでは,生成されるmex関数のx
とcb
の次元にいて,プロパティを次のように設定するとします。
x
とcb
の両方の最初の次元を最大サ@ @ズ3.
の可変にします。
x
の2番目の次元を値1
の固定にします。
cb
の2番目の次元を最大サescズ216
の可変にします。
これらの入力プロパティを指定するには,関数coder.typeof
を使用します。coder.typeof (A, B, 1)
は,クラスと実数/複素数が一个
と同じで,上限がサB
の対応する要素で与えられる可変サ@ @ズの入力を指定します。coder.typeof
を使用するビルドスクリプトbuild_mex_variable.m
を使用して,生成されるmex関数の可変サescズ入力のプロパティを指定します。
加载测试数据负载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}
新しいmex関数euclidean_mex
がx
およびcb
とは異なる次元の入力を受け入れることを確認できます。テストスクリプトtest_2d.m
は,x
とcb
の2次元のバ,ジョンである入力配列x2d
とcb2d
を作成します。その後,それらの入力パラメ,タ,を使用してmatlab関数欧几里得
を呼び出します。
加载测试数据负载euclidean_data.mat创建x和cb的二维版本: x2d = x (1:2);cb2d = cb (1:2, 1:6:216);确定最近点和最远点以及相应的距离[y_min,y_max,idx,distance] = euclidean(x2d,cb2d);显示最近点的输出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))));
test_2d.m
を実行すると,次の出力が生成されます。
最近点的坐标为:0.8 0.8最近点的指数为29距离最近点的距离为0.078672最远点的坐标为:0 0最远点的指数为1距离最远点的距离为1.1357
欧几里得
の呼び出しをeuclidean_mex
の呼び出しに置き換えてテストスクリプトtest_2d.m
を実行するには,coder.runTest
を使用します。
coder.runTest (“test_2d”,“欧几里得”)
x
およびcb
とは異なる次元の入力を受け入れることを確認できます。
目的 | 詳細 |
---|---|
コード生成でサポートされるMATLABの組み込み関数とツールボックス関数,クラス,および系统对象について学習する |
|
c++ mexコドを生成する |
|
入力の型を対話形式で作成および編集する |
|
生成されたコ,ドの実行速度またはメモリ使用量を最適化する |
|
コド生成レポトにいて学習する |
|
生成されたmex関数の実行時間とコドカバレッジをmatlabプロファラで確認する |
Matlabプロファaapl . exe .ラ. exe .を使用したmex関数のプロファaapl . exe . exe |