このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
可変サイズデータは実行時にサイズが変化する可能性のあるデータです。MATLAB®编码员™を使用して、可変サイズ データを使用している MATLABコードから C/C++コードを生成できます。MATLABでは、コード生成に対して制限付きと制限なしの可変サイズ データがサポートされています。“制限付き可変サイズデータ”には固定の上限があります。このデータはスタックで静的に割り当てることも,ヒープで動的に割り当てることもできます。“制限なしの可変サイズデータ”には上限が設定されていません。このデータはヒープで割り当てなければなりません。既定では,墨西哥人コードおよびC / c++コードの生成において可変サイズデータのサポートは有効で,構成可能なしきい値以上のサイズをもつ可変サイズ配列に対し動的なメモリの割り当てが有効になっています。
既定では、墨西哥および C/C++コードの生成において、可変サイズ データのサポートは有効になっています。[プロジェクトの設定] ダイアログ ボックス、コマンド ラインから、またはダイアログ ボックスを使用して可変サイズの設定を変更します。
[生成]ダイアログボックスを開くために,[コード生成]ページの[生成]矢印をクリックします。
[詳細設定]をクリックします。
[メモリ]タブで、[可変サイズを有効化]をオンまたはオフにします。
コード生成の構成オブジェクトを作成します。たとえば、ライブラリの場合は以下のとおりです。
cfg=coder.config('lib');
EnableVariableSizing
オプションを次のように設定します。
cfg.EnableVariableSizing=false;
-配置
オプションを使用して、構成オブジェクトをcodegen
に渡します。
Codegen -config CFG foo
既定では、設定可能なしきい値以上のサイズをもつ可変サイズ配列に対して、動的メモリ割り当てが有効になっています。可変サイズ データのサポートを無効にすると (可変サイズデータのサポートの無効化を参照)、動的メモリ割り当ても無効になります。[プロジェクトの設定] ダイアログ ボックスまたはコマンド ラインから、動的メモリ割り当ての設定を変更できます。
[生成]ダイアログボックスを開くために,[コード生成]ページの[生成]矢印をクリックします。
[詳細設定]をクリックします。
[メモリ]タブで、[動的メモリ割り当て]を次のいずれかのオプションに設定します。
設定 | 動作 |
---|---|
行わない |
動的メモリ割り当てが無効になります。可変サイズ データはスタックで静的に割り当てられます。 |
すべての可変サイズの配列の場合 |
可変サイズ配列に対して動的メモリ割り当てが有効になります。可変サイズ データはヒープで動的に割り当てられます。 |
配列の最大サイズがしきい値以上になった場合 |
[動的メモリ割り当てしきい値]以上のサイズをもつ可変サイズ配列に対して,動的メモリ割り当てが有効になります。このしきい値より小さいサイズの可変サイズ配列は,スタックで割り当てられます。 |
オプションとして、[動的メモリ割り当て]を[配列の最大サイズがしきい値以上になった場合]
に設定した場合は,[動的メモリ割り当てしきい値]を構成してメモリの割り当てを微調整します。
コード生成の構成オブジェクトを作成します。たとえば、墨西哥関数の場合は、以下のようになります。
mexcfg=coder.config('mex');
DynamicMemoryAllocation
オプションを次のように設定します。
設定 | 動作 |
---|---|
mexcfg.DynamicMemoryAllocation='Off'; |
動的メモリ割り当てが無効になります。可変サイズ データはスタックで静的に割り当てられます。 |
mexcfg.DynamicMemoryAllocation =“AllVariableSizeArrays”; |
可変サイズ配列に対して動的メモリ割り当てが有効になります。可変サイズ データはヒープで動的に割り当てられます。 |
DynamicMemoryAllocation='Threshold'; |
DynamicMemoryAllocationThreshold パラメーターを使用して指定された値以上のサイズ(バイト単位)の可変サイズ配列に対して動的メモリ割り当てが有効になります。このしきい値より小さいサイズの可変サイズ配列は,スタックで割り当てられます。 |
オプションとして,(DynamicMemoryAllocation
]を[“阈值”
] に設定する場合は、[DynamicMemoryAllocationThreshold
] を構成してメモリ割り当てを調整します。
-配置
オプションを使用して、構成オブジェクトをcodegen
に渡します。
codegen-配置mexcfg foo
はじめに 墨西哥コードを生成して生成コードを検証し、次にプロトタイプの結果に満足できたらスタンドアロン コードを生成する基本ワークフローを以下に示します。
簡単な例を使用してこれらの手順を実行するには、ループ内でベクトルを拡張する MATLAB関数のコードの生成を参照してください。
MATLABエディターで,コンパイル命令% # codegen
を関数の最上部に追加します。
この命令は,以下を実行します。
MATLABアルゴリズムのコードを生成することを示す。
コード生成中に潜在的なエラーを検出するために MATLABコード アナライザーでのチェックをオンにする。
コードアナライザーで検出された問題を解決します。
場合によっては、コードでデータに固定サイズが割り当てられているときに、ループでの割り当てや連結によって後からデータが大きくなると、MATLABコード アナライザーが警告を表示することがあります。実行時にデータのサイズが変化することが想定されている場合は、これらの警告を無視できます。
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
は実行時チェックを実行し、データが上限を超えた場合はエラーを生成します。
サイズ不一致エラーを解決します。
原因 | 解決方法 | 詳細 |
---|---|---|
データのサイズがロックされた後にサイズを変更しようとした。 | データを可変サイズとして宣言します。 | サイズ不一致エラーの診断と修正を参照してください。 |
上限エラーを解決します。
原因 | 解決方法 | 詳細 |
---|---|---|
MATLABが上限を判断または計算できない。 | 上限を指定します。 | 可変サイズ配列の上限の指定とサイズ不一致エラーの診断と修正を参照してください。 |
MATLABが制限なしの可変サイズデータの上限を計算しようとした。 | 制限なしのデータの場合は、動的メモリ割り当てを有効にします。 | 動的メモリ割り当ての制御を参照してください。 |
関数codegen
を使用してC / c++コードを生成します。
この例は、関数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;终止终止
コンパイル命令% # 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;终止终止
コードアナライザーは変数B
のサイズが为了-
ループ内で変化する可能性を検出します。これにより,次の警告が表示されます。
变量“B”似乎在每个循环迭代中改变大小,考虑速度的预分配。
この関数では、ベクトルB
はベクトルA.
から値を追加するためサイズを拡大することが想定されます。したがって、この警告は無視できます。
C / c++コードを生成する前に墨西哥人コードを生成することをお勧めします。墨西哥人コードを生成することによって,実行時には検出が難しくなるコード生成上の問題を特定できます。
myuniquetol
の 墨西哥関数を生成します。
codegen-report myuniquetol-args{coder.typeof(0[1100],1),coder.typeof(0)}
コード生成は正常に実行されます。codegen
で問題は検出されません。現在のフォルダーで、codegen
がmyuniquetol
の墨西哥人関数を生成し,コード生成レポートへのリンクを提供します。
[レポートの表示]リンクをクリックします。
コード生成レポートで[変数]タブを選択します。
A.
は上限が100
の可変サイズであることを指定したため、A.
のサイズは1 行 :100 列
です。変数B
のサイズは1 x: ?
で,上限のない可変サイズであることが示されます。
可変サイズ入力の Cコードを生成します。既定では、codegen
は,動的メモリ割り当てしきい値の64キロバイトより小さいサイズのデータに対してメモリを静的に割り当てます。データのサイズがしきい値以上の場合や制限なしの場合,codegen
はヒープでメモリを動的に割り当てます。
Cライブラリ生成の構成オプションを作成します。
cfg=coder.config('lib');
次のコマンドを実行します。
codegen-config cfg-report myuniquetol-args{coder.typeof(0[1100],1),coder.typeof(0)}
codegen
は、既定の場所codegen\lib\myuniquetol
にスタティックライブラリを生成し,コード生成レポートへのリンクを提供します。
[レポートの表示]リンクをクリックします。
生成ファイルのリストで,myuniquetol.h
をクリックします。
関数宣言は以下のとおりです。
外部无效myuniquetol(常数双A_数据[],常数int A_大小[2],双tol,emxArray_实T*B);
codegen
はA.
のサイズを計算し,その最大サイズが既定の動的メモリ割り当てしきい値の64バイトより小さいため,このメモリを静的に割り当てます。生成されたコードには次が含まれます。
双A_数据[]
:A.
の定義。
int A_大小[2]
:入力の実際のサイズ。
コード ジェネレーターは、B
が、上限が不明な可変サイズであると判断します。これはB
をemxArray_real_T
として表します。MATLABは、生成されたコード内で埃姆萨雷斯
を作成して相互作用のためのユーティリティ関数を提供します。詳細は,生成された関数インターフェイスでの C配列の使用を参照してください。
入力A.
は上限が100
の可変サイズであることを指定しました。このため,出的力B
を100
要素よりも大きくすることはできません。
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]
に格納します。
この手順では、動的メモリ割り当てしきい値を減らして、このしきい値を超える入力のコードを生成します。この手順では、A.
の2番目の次元に上限10000
があることを指定します。
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
動的メモリ割り当てしきい値を 4.キロバイトに設定し、入力A.
のサイズがこのしきい値を超える場合のコードを生成します。
DynamicMemoryAllocationThreshold=4096;codegen-config cfg-report myuniquetol-args{coder.typeof(0,[1 10000],1),coder.typeof(0)}
レポートで生成コードを表示します。現在、A.
とB
の最大サイズが動的メモリ割り当てしきい値を超えているため、codegen
はA.
とB
をヒープで動的に割り当てます。生成されたコードでは、A.
とB
は型emxArray_real_T
をもちます。
extern void myuniquetol(const emxArray_real_T *A, double tol, emxArray_real_T *B);