主要内容

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

MATLABアルゴリズムを高层化学するのMEX关键词生成

MATLAB®编码器™を使用してMATLABコードから墨西哥人関数を生成できます。墨西哥人関数はMATLABの実行可能ファイルです。生成されたコードはMATLAB内から呼び出すことができます。墨西哥人関数を使用すると,MATLAB環境内での作業において,MATLABコードの計算量の多い部分を高速化できます。MATLABコードから墨西哥人関数を生成するには,MATLAB编码器アプリを使用するか,MATLABコマンドラインでcodegenを使用します。

このチュートリアルでは,MATLAB编码器codegenコマンドコマンドを使し,matlab关节のmex关节生成します。最初最初,固定の既定サイズの入をmex关节を生后后后しますしその后后受け入れるもうもうののののののののを生成します。

チュートリアルファイル

チュートリアルファイルをフォルダーmatlabroot\ help \ toolbox \ coder \ examplex \ euclideanからローカルの作業フォルダーにコピーします。ここで,matlabrootはMATLABのインストールフォルダーです(例:C:\ Program Files \ Matlab \ R2019A)。

Copyfile(FullFile(MatlaBroot,'帮助''工具箱''编码器'“例子”'euclidean'))
ローカルの作業フォルダーを私人フォルダーまたは@フォルダーにすることはできません。このチュートリアルで使用するファイルは,euclidean_data.mat.欧几里德test.m.test_2d.mbuild_mex_fixed.m.,およびbuild_mex_variable.mです。

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

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

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

  • matlabファイル欧几里德には,この例の”“コアアルゴリズムを実装する関数欧几里得が含まれています。この关键XCB.をを力量としてます。XCB.の各点の間のユークリッド距離を計算して次の量を返します。

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

    • 列ベクトルy_maxXからから最も远い点を表すCB.の列と等しくなります。

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

    • 2次元のベクトル距离X

    功能[y_min,y_max,idx,距离] = 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=norm(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.は,データファイルeuclidean_data.mat.关をスペーススペースに読み込み読み込み。关联欧几里得を呼び出してy_miny_maxidx,および距离を計算します。このスクリプトで計算された量がコマンドラインに表示されます。

    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スクリプトtest_2d.mは、2.次元ユークリッド空間の点を表すためにtest.m.を変更したものです。test_2d.mの内容については,このチュートリアルの后半でMEX关数の可変サイズ入力のテストに使用するときに说明します。

  • ビルドスクリプトbuild_mex_fixed.m.build_mex_variable.mには,matlabコードから静的なcライブラリを生成するためコマンドが固定サイズの入をものと可サイズの入受け入れるものにててされてますてこれられています。チュートリアルの后半でcコードを生成するに明明します。

ヒント

matlab关节からのの生成には,MATLAB编码器をを使ますます。

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

MATLAB関数の墨西哥人関数の生成

元の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エディターエディター,欧几里德を开启ます.matlabエディターの右右あるコードアナライザーインジケーターはになりますます。

  2. 关关宣言后に,% # codegen命令を追加します。

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

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

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

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

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

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

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

  5. コード生成の制备状态状态を行するするに,matlabコマンドラインから关联coder.screenerを呼び出します。

    coder.screener ('euclidean'的)

    欧几里得についてについてはでコードれれ详细についてについてはについてについてははについてについて,コード生成の準備状態ツールを参照してください。

    コード生成の制备状态ツールは,MATLAB在线™ではサポートされていません。

    メモ

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

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

メモ

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

入力の型の定義

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

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

次のステップでは,codegenコマンドを使用して,エントリポイント関数欧几里得から墨西哥人ファイルを生成します。

Mex关节生成と検证

ビルドスクリプトbuild_mex_fixed.m.欧几里德の墨西哥人関数の生成と検証に使用するコマンドが含まれています。墨西哥人関数を検証するには,MATLAB関数欧几里得の呼び出しを生成された 墨西哥関数の呼び出しに置き換えてテスト スクリプト测试を実行します。

%加载测试数据加载euclidean_data.mat.%使用Codegen生成euclidean.m的代码。使用测试数据为示例输入。使用TEST.M验证MEX。codegen报告欧几里德-  args.{x,cb}-测试测试
次の点に注意してください。

  • 既定で、codegenは,现处于のフォルダーにeuclidean_mexという名前のMEX关键词生成しし。

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

  • - args.オプションオプション,エントリポイント关圈欧几里得コードジェネレーターはますししします,この情はをてて入引ててて。

  • -测试オプションを使使て,テストファイルtest.m.を実行し。このこのオプション,テストファイルの欧几里得の呼び出しがeuclidean_mexの呼び出しに置き换えられます。

コード生成オプションの详细はは,codegenを参照してください。

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

    コードジェネレーターにより,墨西哥人関数euclidean_mexが現在の作業フォルダーに生成されます。

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

    代码生成成功:查看报告。运行测试文件:使用MEX函数'euclidean_mex''test'。最近点的坐标是:0.8 0.8 0.4最接近点的索引为171距离,最接近点为0.080374坐标是:0 0 1最远点指数为6距离到最远点为1.2923
    このこの力量が元元MATLAB关键几生成された力と一致する,MEX关关を确认ます。

  2. -[レポートレポートの]をクリックします。

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

ヒント

コマンドラインでのの生成にはビルドスクリプトをしはます。

可サイズサイズ力のMEX关关の生成

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

ここでは,生成される墨西哥人関数のXCB.の次元について,プロパティを次のように设定するとします。

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

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

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

これらの入力プロパティを指定するには,関数Coder.typeof.を使用します。coder.typeof (A, B, 1)は,クラスと実数/複素数が一种と同じで,上限がサイズB.Coder.typeof.を使用するビルドスクリプトbuild_mex_variable.mを使用して,生成される墨西哥人関数の可変サイズ入力のプロパティを指定します。

%加载测试数据加载euclidean_data.mat.%使用编码器。指定可变大小的输入eg_x = coder.typeof(x,[3 1],1);eg_cb = coder.typeof(cb,[3 216],1);生成欧几里得的代码。使用编码器。typeof指定示例输入的上限值codegen报告欧几里德-  args.{eg_x,eg_cb}

新しい 墨西哥関数euclidean_mexXおよびCB.テスト异なる次元の入受け入れることを确认できますテストスクリプトtest_2d.mXCB.の2次元のバージョンであるである力配列X2D.cb2dを作成します。その後,それらの入力パラメーターを使用してMATLAB関数欧几里得を呼び出します。

%加载测试数据加载euclidean_data.mat.%创建x和cb的2-d版本: x2d = x (1:2);cb2d = cb (1:2, 1:6:216);%确定最近和最远的点和相应的距离[y_min,y_max,idx,距离] = 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を使用します。

编码器.Runtest(“test_2d”'euclidean'的)
Matlab关关で生成されることから,新闻Mex关键词XおよびCB.とは異なる次元の入力を受け入れることを確認できます。

次のステップ

目的 详细

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

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

c++墨西哥人コードを生成する

c++コード生成

入力の型を対话形式作物

コード生成の型エディターををした力のの作物

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

最最化手法

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

コード生成レポート

生成された墨西哥人関数の実行時間とコードカバレッジをMATLABプロファイラーで確認する

MATLABプロファイラーを使用した墨西哥人関数のプロファイリング

参考

||