主要内容

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

可変サイズデータのためのコード生成

可変サイズデータは実行時にサイズが変化する可能性のあるデータです。MATLAB®编码员™を使用して、可変サイズ データを使用している MATLABコードから C/C++コードを生成できます。MATLABでは、コード生成に対して制限付きと制限なしの可変サイズ データがサポートされています。“制限付き可変サイズデータ”には固定の上限があります。このデータはスタックで静的に割り当てることも,ヒープで動的に割り当てることもできます。“制限なしの可変サイズデータ”には上限が設定されていません。このデータはヒープで割り当てなければなりません。既定では,墨西哥人コードおよびC / c++コードの生成において可変サイズデータのサポートは有効で,構成可能なしきい値以上のサイズをもつ可変サイズ配列に対し動的なメモリの割り当てが有効になっています。

可変サイズデータのサポートの無効化

既定では、墨西哥および C/C++コードの生成において、可変サイズ データのサポートは有効になっています。[プロジェクトの設定] ダイアログ ボックス、コマンド ラインから、またはダイアログ ボックスを使用して可変サイズの設定を変更します。

MATLAB编码器アプリの使用

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

  2. [詳細設定]をクリックします。

  3. [メモリ]タブで、[可変サイズを有効化]をオンまたはオフにします。

コマンド ラインの入力

  1. コード生成の構成オブジェクトを作成します。たとえば、ライブラリの場合は以下のとおりです。

    cfg=coder.config('lib');

  2. EnableVariableSizingオプションを次のように設定します。

    cfg.EnableVariableSizing=false;

  3. -配置オプションを使用して、構成オブジェクトをcodegenに渡します。

    Codegen -config CFG foo

動的メモリ割り当ての制御

既定では、設定可能なしきい値以上のサイズをもつ可変サイズ配列に対して、動的メモリ割り当てが有効になっています。可変サイズ データのサポートを無効にすると (可変サイズデータのサポートの無効化を参照)、動的メモリ割り当ても無効になります。[プロジェクトの設定] ダイアログ ボックスまたはコマンド ラインから、動的メモリ割り当ての設定を変更できます。

MATLAB编码器アプリの使用

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

  2. [詳細設定]をクリックします。

  3. [メモリ]タブで、[動的メモリ割り当て]を次のいずれかのオプションに設定します。

    設定 動作
    行わない 動的メモリ割り当てが無効になります。可変サイズ データはスタックで静的に割り当てられます。
    すべての可変サイズの配列の場合 可変サイズ配列に対して動的メモリ割り当てが有効になります。可変サイズ データはヒープで動的に割り当てられます。
    配列の最大サイズがしきい値以上になった場合 [動的メモリ割り当てしきい値]以上のサイズをもつ可変サイズ配列に対して,動的メモリ割り当てが有効になります。このしきい値より小さいサイズの可変サイズ配列は,スタックで割り当てられます。

  4. オプションとして、[動的メモリ割り当て][配列の最大サイズがしきい値以上になった場合]に設定した場合は,[動的メモリ割り当てしきい値]を構成してメモリの割り当てを微調整します。

コマンド ラインの入力

  1. コード生成の構成オブジェクトを作成します。たとえば、墨西哥関数の場合は、以下のようになります。

    mexcfg=coder.config('mex');

  2. DynamicMemoryAllocationオプションを次のように設定します。

    設定 動作
    mexcfg.DynamicMemoryAllocation='Off';
    動的メモリ割り当てが無効になります。可変サイズ データはスタックで静的に割り当てられます。
    mexcfg.DynamicMemoryAllocation =“AllVariableSizeArrays”;
    可変サイズ配列に対して動的メモリ割り当てが有効になります。可変サイズ データはヒープで動的に割り当てられます。
    DynamicMemoryAllocation='Threshold';
    DynamicMemoryAllocationThresholdパラメーターを使用して指定された値以上のサイズ(バイト単位)の可変サイズ配列に対して動的メモリ割り当てが有効になります。このしきい値より小さいサイズの可変サイズ配列は,スタックで割り当てられます。

  3. オプションとして,(DynamicMemoryAllocation]を[“阈值”] に設定する場合は、[DynamicMemoryAllocationThreshold] を構成してメモリ割り当てを調整します。

  4. -配置オプションを使用して、構成オブジェクトをcodegenに渡します。

    codegen-配置mexcfg foo

可変サイズデータによるMATLAB関数のコードの生成

はじめに 墨西哥コードを生成して生成コードを検証し、次にプロトタイプの結果に満足できたらスタンドアロン コードを生成する基本ワークフローを以下に示します。

簡単な例を使用してこれらの手順を実行するには、ループ内でベクトルを拡張する MATLAB関数のコードの生成を参照してください。

  1. MATLABエディターで,コンパイル命令% # codegenを関数の最上部に追加します。

    この命令は,以下を実行します。

    • MATLABアルゴリズムのコードを生成することを示す。

    • コード生成中に潜在的なエラーを検出するために MATLABコード アナライザーでのチェックをオンにする。

  2. コードアナライザーで検出された問題を解決します。

    場合によっては、コードでデータに固定サイズが割り当てられているときに、ループでの割り当てや連結によって後からデータが大きくなると、MATLABコード アナライザーが警告を表示することがあります。実行時にデータのサイズが変化することが想定されている場合は、これらの警告を無視できます。

  3. codegenを使用して 墨西哥関数を生成し、生成されたコードを検証します。以下のコマンド ライン オプションを使用します。

    • args {coder.typeof…}:可変サイズ入力がある場合

    • 报告: コード生成レポートを生成する場合

    以下に例を示します。

    codegen-report foo-args{coder.typeof(0[24],1)}
    このコマンドは编码员を使用して関数への可変サイズ入力を 1.つ指定します。最初の引数0は,入力データ型() と実数/複素数 (真实的) を示します。2.番目の引数[2 4]は、サイズを示す 2.次元の行列です。3.番目の引数1.は、入力が可変サイズであることを示します。最初の次元の上限は 2.で、2.番目の次元の上限は 4.です。

    メモ

    コンパイル中にcodegenは定義後にサイズが変化した変数と構造体フィールドを検出し,これらが発生した場合はエラーとして報告します。さらに,codegenは実行時チェックを実行し、データが上限を超えた場合はエラーを生成します。

  4. サイズ不一致エラーを解決します。

    原因 解決方法 詳細
    データのサイズがロックされた後にサイズを変更しようとした。 データを可変サイズとして宣言します。 サイズ不一致エラーの診断と修正を参照してください。
  5. 上限エラーを解決します。

    原因 解決方法 詳細
    MATLABが上限を判断または計算できない。 上限を指定します。 可変サイズ配列の上限の指定サイズ不一致エラーの診断と修正を参照してください。
    MATLABが制限なしの可変サイズデータの上限を計算しようとした。 制限なしのデータの場合は、動的メモリ割り当てを有効にします。 動的メモリ割り当ての制御を参照してください。
  6. 関数codegenを使用してC / c++コードを生成します。

ループ内でベクトルを拡張するMATLAB関数のコードの生成

MATLAB関数 米尼克托について

この例は、関数myuniquetolを使用します。この関数は,入力ベクトルA.のバージョンであるベクトルBで返されます。ここで、各要素はそれぞれの許容誤差托尔内で一意であるとします。ベクトルBでは,すべてのJに対して防抱死制动系统(B() -B(J)) >托尔となります。まず,入力ベクトルA.100年は最大までの要素を格納できると想定します。

作用B = myuniquetol(A, tol);B = (1);k = 1;对于i=2:长度(A)如果abs(A(k)-A(i))>tolb=[ba(i)];k=i;终止终止

手順1:コード生成のコンパイル命令の追加

コンパイル命令% # codegenを関数の最上部に追加します。

作用B = myuniquetol(A, tol)% # codegenA=排序(A);B=A(1);k=1;对于i=2:长度(A)如果abs(A(k)-A(i))>tolb=[ba(i)];k=i;终止终止

手順2:コードアナライザーで検出された問題の解決

コードアナライザーは変数Bのサイズが为了-ループ内で変化する可能性を検出します。これにより,次の警告が表示されます。

变量“B”似乎在每个循环迭代中改变大小,考虑速度的预分配。

この関数では、ベクトルBはベクトルA.から値を追加するためサイズを拡大することが想定されます。したがって、この警告は無視できます。

手順 3:MEXコードの生成

C / c++コードを生成する前に墨西哥人コードを生成することをお勧めします。墨西哥人コードを生成することによって,実行時には検出が難しくなるコード生成上の問題を特定できます。

  1. myuniquetolの 墨西哥関数を生成します。

    codegen-report myuniquetol-args{coder.typeof(0[1100],1),coder.typeof(0)}

    これらのコマンドラインオプションの意味

    コード生成は正常に実行されます。codegenで問題は検出されません。現在のフォルダーで、codegenmyuniquetolの墨西哥人関数を生成し,コード生成レポートへのリンクを提供します。

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

  3. コード生成レポートで[変数]タブを選択します。

    A.は上限が100の可変サイズであることを指定したため、A.のサイズは1 行 :100 列です。変数Bのサイズは1 x: ?で,上限のない可変サイズであることが示されます。

手順 4:Cコードの生成

可変サイズ入力の Cコードを生成します。既定では、codegenは,動的メモリ割り当てしきい値の64キロバイトより小さいサイズのデータに対してメモリを静的に割り当てます。データのサイズがしきい値以上の場合や制限なしの場合,codegenはヒープでメモリを動的に割り当てます。

  1. Cライブラリ生成の構成オプションを作成します。

    cfg=coder.config('lib');
  2. 次のコマンドを実行します。

    codegen-config cfg-report myuniquetol-args{coder.typeof(0[1100],1),coder.typeof(0)}

    codegenは、既定の場所codegen\lib\myuniquetolにスタティックライブラリを生成し,コード生成レポートへのリンクを提供します。

  3. [レポートの表示]リンクをクリックします。

  4. 生成ファイルのリストで,myuniquetol.hをクリックします。

    関数宣言は以下のとおりです。

    外部无效myuniquetol(常数双A_数据[],常数int A_大小[2],双tol,emxArray_实T*B);

    codegenA.のサイズを計算し,その最大サイズが既定の動的メモリ割り当てしきい値の64バイトより小さいため,このメモリを静的に割り当てます。生成されたコードには次が含まれます。

    • 双A_数据[]:A.の定義。

    • int A_大小[2]:入力の実際のサイズ。

    コード ジェネレーターは、Bが、上限が不明な可変サイズであると判断します。これはBemxArray_real_Tとして表します。MATLABは、生成されたコード内で埃姆萨雷斯を作成して相互作用のためのユーティリティ関数を提供します。詳細は,生成された関数インターフェイスでの C配列の使用を参照してください。

手順5:出力ベクトルに対する上限の指定

入力A.は上限が100の可変サイズであることを指定しました。このため,出的力B100要素よりも大きくすることはできません。

  • coder.varsizeを使用して、Bは上限が100の可変サイズであることを示します。

    函数B=myuniquetol(A,tol)%#codegen A=sort(A);coder.varsize('B',[1100],[01]);B=A(1);k=1;对于i=2:如果abs(A(k)-A(i))>tol B=[ba(i)];k=i;end-end

  • コードを生成します。

    codegen-config cfg-report myuniquetol-args{coder.typeof(0[1100],1),coder.typeof(0)}

    関数宣言は以下のとおりです。

    extern void myuniquetol(const double A_data[], const int A_size[2], double tol, double B_data[], int B_size[2]);

    コードジェネレーターは,メモリをBに静的に割り当てます。Bのサイズを整数B_大小[2]に格納します。

手順6:動的メモリ割り当てしきい値の変更

この手順では、動的メモリ割り当てしきい値を減らして、このしきい値を超える入力のコードを生成します。この手順では、A.の2番目の次元に上限10000があることを指定します。

  1. Bの上限をA.の上限と一致するように変更します。

    函数B=myuniquetol(A,tol)%#codegen A=sort(A);coder.varsize('B',[1 10000],[0 1]);B=A(1);k=1;对于i=2:如果abs(A(k)-A(i))>tol B=[B A(i)];k=i;end-end

  2. 動的メモリ割り当てしきい値を 4.キロバイトに設定し、入力A.のサイズがこのしきい値を超える場合のコードを生成します。

    DynamicMemoryAllocationThreshold=4096;codegen-config cfg-report myuniquetol-args{coder.typeof(0,[1 10000],1),coder.typeof(0)}

  3. レポートで生成コードを表示します。現在、A.Bの最大サイズが動的メモリ割り当てしきい値を超えているため、codegenA.Bをヒープで動的に割り当てます。生成されたコードでは、A.Bは型emxArray_real_Tをもちます。

    extern void myuniquetol(const emxArray_real_T *A, double tol, emxArray_real_T *B);

関連するトピック