可変サイズ配列の最大サイズの指定
可変サイズ配列の配列サイズを制限するには、以下のいずれかを行います。
配列サイズを指定する変数がコンパイル時の定数でない場合は、
assertステートメントを関係演算子とともに使用して、変数を制限します。このようにすると、コード ジェネレーターが配列の最大サイズを判別できるようになります。次の例では、
assertステートメントを使用して配列サイズを制限しています。入力変数
Nで配列yを初期化する関数array_initを定義します。function y = array_init (N) assert(N <= 25); % Generates exception if N > 25 y = zeros(1,N);
assertステートメントでは、入力Nは最大サイズの 25 に制限されます。assertステートメントが存在しない場合、生成コードでは、yが配列へのポインターに割り当てられ、このようにして動的メモリ割り当てが可能になります。2 つの入力変数
MとNを取り込み、その積を使用して配列yの最大サイズを指定する関数array_init_from_prodを定義します。function y = array_init_from_prod (M,N) size=M*N; assert(size <= 25); % Generates exception if size > 25 y=zeros(1,size);
assertステートメントでは、MとNの積は最大 25 に制限されます。また、
MとNを個別に制限すると、動的メモリ割り当てが発生します。function y = array_init_from_prod (M,N) assert(M <= 5); assert(N <= 5); size=M*N; y=zeros(1,size);このコードでは
NとMはどちらも制限なしの負の値を設定できるため、動的メモリ割り当てが発生します。したがって、それぞれが正の値に制限されているとしても、その積は制限のない正になります。ヒント
配列サイズの指定に使用する直前で、変数に assert ステートメントを置きます。
ヒント
ほとんどの場合、
assertステートメントを使用して、配列サイズを制限できます。ループ内で配列を拡張するとき、ループの実行回数が実行時にしかわからない場合、この手法は有効ではありません。
上限を指定した coder.varsize の使用によるループ内での連結の制限連結によって配列を、初期サイズを超えて拡張できます。ループ内で追加要素を連結する場合、配列を拡張するための 2 つの構文規則があります。
初期化時の配列のサイズがコンパイル時の定数ではない場合、追加要素を連結することによって配列を拡張できます。
function out=ExpandArray(in) % Expand an array by five elements out = zeros(1,in); for i=1:5 out = [out 0]; end
要素を連結する前に、
coder.varsizeを使用して配列を可変サイズとして宣言しなければなりません。function out=ExpandArray() % Expand an array by five elements out = zeros(1,5); coder.varsize('out'); for i=1:5 out = [out 0]; end
どちらの場合でも、動的メモリ割り当てが発生します。このような場合に動的メモリ割り当てを防ぐには、明示的な上限を指定して
coder.varsizeを使用します。この例では、明示的な上限を指定してcoder.varsizeを使用する方法を示します。例1 上限を指定した coder.varsize の使用による連結の制限配列の
N要素のサブセットのランニング平均を計算する関数RunningAverageを定義します。function avg=RunningAverage(N) % Array whose elements are to be averaged NumArray=[1 6 8 2 5 3]; % Initialize average: % These will also be the first two elements of the function output avg=[0 0]; % Place a bound on the argument coder.varsize('avg',[1 8]); % Loop to calculate running average for i=1:N s=0; s=s+sum(NumArray(1:i)); avg=[avg s/i]; % Increase the size of avg as required by concatenation end
出力
avgは、ランニング平均の格納に必要な分だけ拡張可能な配列です。新しいランニング平均が計算されると、連結によって配列avgにその分が追加され、これによって配列が拡張されます。ランニング平均の最大数は
NumArrayの要素数に等しいため、coder.varsizeステートメントでavgの明示的な上限を指定できます。この例では、上限は 8 です (2 つの初期要素と、NumArrayの 6 つの要素)。double型の入力引数をもつRunningAverageのコードを生成します。codegen -config:lib -report RunningAverage -args 2
生成されたコードで
avgはサイズ 8 の配列に割り当てられます (静的メモリ割り当て)。RunningAverageの関数定義は以下のようになります (組み込み C 型を使用)。void RunningAverage (double N, double avg_data[8], int avg_size[2])
一方、明示的な上限を削除する場合は、生成されたコードで
avgは動的に割り当てられます。以下のステートメント
coder.varsize('avg',[1 8]);を次に置き換えます。
coder.varsize('avg');double型の入力引数をもつRunningAverageのコードを生成します。codegen -config:lib -report RunningAverage -args 2
生成されたコードで
avgは配列へのポインターに割り当てられ、これによって動的メモリ割り当てが可能になります。RunningAverageの関数定義は以下のようになります (組み込み C 型を使用)。void Test(double N, emxArray_real_T *avg)
メモ
次の assert ステートメントの前に
coder.varsize('avg')を置いた場合にも、動的メモリ割り当てが発生します。assert(N < 6);
assertステートメントでは、ループ内の連結回数が制限されません。
ステートメント
out = reshape(in,m,n,...)は配列inを引数として受け取り、配列outを返します。この配列はinと同じ要素をもちますが、mxnx...の行列として形状変更されます。サイズ変数m,n,...のいずれかがコンパイル時の定数ではない場合、outの動的メモリ割り当てが行われます。動的メモリ割り当てを回避するには、
assertステートメントをreshapeステートメントの前に使用して、サイズ変数m,n,...をnumel(in)に制限します。この例では、assertステートメントをreshapeステートメントの前に使用する方法を示します。例2 指定された行数への行列の再配列入力変数
Nを受け取り、行列matがN行になるように形状変更する関数ReshapeMatrixを定義します。function [out1,out2] = ReshapeMatrix(N) mat = [1 2 3 4 5; 4 5 6 7 8] % Since mat has 10 elements, N must be a factor of 10 % to pass as argument to reshape out1 = reshape(mat,N,[]); % N is not restricted assert(N < numel(mat)); % N is restricted to number of elements in mat out2 = reshape(mat,N,[]);
codegenコマンドを使用してReshapeArrayのコードを生成します (入力引数を 10 の約数にする必要はありません)。codegen -config:lib -report ReshapeArray -args 3
out1が動的に割り当てられる一方で、out2は生成されたコードでサイズ 100 (=10 行 10 列) の配列に割り当てられます。ヒント
システムでメモリが制限されている場合は、
assertステートメントをこの方法で使用しないでください。n要素の行列の場合、assertステートメントは、n行n列の行列を作成するため、大きくなる可能性があります。
参考
トピック
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)