可変サイズ配列の最大サイズの指定
可変サイズ配列の配列サイズを制限するには、以下のいずれかを行います。
配列サイズを指定する変数がコンパイル時の定数でない場合は、
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
と同じ要素をもちますが、m
xn
x...
の行列として形状変更されます。サイズ変数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 コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)