Main Content

可変サイズの配列のコード生成

コード生成では、配列の次元は "固定サイズ" または "可変サイズ" になります。コード ジェネレーターで次元のサイズと、次元のサイズが変更されていないことを確認できる場合、次元は固定サイズです。配列のすべての次元が固定サイズである場合、配列は "固定サイズ" の配列になります。以下の例では、Z は固定サイズの配列です。

function Z = myfcn()
Z = zeros(1,4);
end

最初の次元のサイズは 1 で、2 番目の次元のサイズは 4 です。

コード ジェネレーターで次元のサイズを確認できない場合、またはコード ジェネレーターがサイズが変更されたと判断する場合、次元は可変サイズです。少なくとも 1 つの次元が可変サイズである場合、配列は "可変サイズ" 配列になります。

可変サイズの次元は、"制限付き" または "制限なし" のいずれかです。制限付き次元には固定のサイズ上限があります。制限なし次元には固定のサイズ上限がありません。

次の例では、Z の 2 番目の次元が制限付きの可変サイズです。16 という上限があります。

function s = myfcn(n)
if (n > 0)
    Z = zeros(1,4);
else
    Z = zeros(1,16);
end
s = length(Z);

次の例では、n の値がコンパイル時に不明な場合、Z の 2 番目の次元は制限なしです。

function s = myfcn(n)
Z = rand(1,n);
s = sum(Z);
end

次のように可変サイズ配列を定義できます。

  • zeros などのコンストラクターで不定次元を使用する

  • 同一の変数に対して、その変数を使う前に複数種類の固定サイズを代入する

  • coder.varsize を使用して、1 つの変数のすべてのインスタンスを可変サイズとして宣言する

詳細については、コード生成のための可変サイズ データの定義を参照してください。

コード生成で可変サイズの配列を許可するかどうか制御できます。可変サイズの配列に対するサポートの有効化および無効化を参照してください。

可変サイズ配列のメモリ割り当て

サイズがしきい値よりも小さい固定サイズの配列と可変サイズの配列では、コード ジェネレーターはスタックでメモリを静的に割り当てます。制限のない可変サイズの配列およびサイズがしきい値以上の可変サイズの配列では、コード ジェネレーターはヒープでメモリを動的に割り当てます。

MATLAB Function ブロックでは、パラメーターの動的メモリ割り当てを使用できません。パラメーターは固定サイズでなければなりません。

動的メモリ割り当てを許可するかどうか、コード生成で使用するタイミングを制御できます。MATLAB Function ブロック内の可変サイズ配列に対するメモリ割り当ての制御を参照してください。

コード ジェネレーターは、動的に割り当てられたデータを emxArray と呼ばれる構造体型として表します。コード ジェネレーターは、emxArrays を作成して操作するユーティリティ関数を生成します。Embedded Coder® を使用する場合は、emxArray 型とユーティリティ関数用に生成された識別子をカスタマイズできます。Identifier Format Control (Embedded Coder)を参照してください。

可変サイズの配列に対するサポートの有効化および無効化

既定では、MATLAB Function ブロックについて、可変サイズの配列に対するサポートは有効化されています。このサポートを無効にするには、次のようにします。

  1. MATLAB Function ブロック エディターで、[データの編集] を選択します。

  2. [可変サイズの配列をサポート] チェック ボックスをオフにします。

MATLAB 関数レポートでの可変サイズの配列

MATLAB 関数レポートで [変数] タブの [サイズ] 列を確認することで、配列が固定サイズか可変サイズかがわかります。

This image shows a code generation report with several kinds of sizes for the second dimension of three arrays. The second dimension of y is fixed-size, n is fixed-size, and x is unbounded and variable-size.

コロン (:) は、次元が可変サイズであることを示しています。疑問符 (?) は、サイズの制限がないことを示しています。たとえば、サイズが 1 行 :? 列である場合、最初の次元のサイズは固定サイズ 1 で、2 番目の次元のサイズは制限のない可変サイズであることを示します。イタリックは、コードでは配列が可変サイズであると指定するが、コード ジェネレーターでは配列がサイズを変更しないと判断することを示しています。

This image shows a code generation report with several kinds of sizes for the second dimension of three arrays. y is fixed-size, n is fixed-size, and Z is variable-size but did not change size during execution.

関連するトピック