end+1 インデックスによって拡張される配列のコード生成
MATLAB® では、end 関数を使用して、配列の end+1 番目の要素に値を代入できます。この代入により、配列が拡張されます。既定では、コード生成において MATLAB コード内で配列および cell 配列を拡張するこのメカニズムがサポートされています。end+1 インデックスを使用して配列または cell 配列を拡張する MATLAB 関数のコードを生成すると、コード ジェネレーターはサイズが変化する配列の次元を可変サイズとして指定します。コード生成における固定サイズおよび可変サイズのデータの詳細については、Generate Code for Variable-Size Arrays (MATLAB Coder)を参照してください。
配列および cell 配列の制限事項
end+1 を使用して配列を拡張する MATLAB 関数のコードを生成するには、次の制限事項に従う必要があります。
可変サイズ サポートを無効にしないでください。[可変サイズを有効化] (MATLAB Coder) または可変サイズの配列をサポートを参照してください。
end+1は、ベクトルの拡張にのみ使用できます。たとえば、Xは行列であるため、次の関数のコード生成は失敗します。function X = foo X = [1 2;3 4]; X(end+1,:) = 5; end
end+1を使用して行ベクトルおよび列ベクトルを拡張できます。ただし、コード生成時には可変長列ベクトルであるが、実行時にはスカラーである配列を拡張するためにend+1を使用すると、生成された MEX 関数でエラーが発生したり、生成されたコードの出力が MATLAB の出力と異なったりすることがあります。実行時にスカラーとして初期化される可変サイズの列配列の拡張 (MATLAB Coder)を参照してください。end+1より後の要素 (end+2など) に値を代入して配列を拡張することはできません。end+1を使用して、空の 1 行 0 列または 0 行 0 列の配列を拡張できます。ただし、end+1を使用した 0 行 1 列の配列の拡張はサポートされていません。構造体のフィールド、オブジェクトのプロパティ、または入れ子関数の変数を拡張するために
end+1を使用することはできません。ドット表記を使用して構造体配列を定義してから、
end+1を使用してその構造体の配列を拡張することはできません。たとえば、次の MATLAB 関数のコード生成は失敗します。function growStruct s.field1 = 5; s.field2 = 2; s(end+1) = s; end
end+1を使用して構造体配列を拡張するには、structコンストラクターを使用して構造体のフィールドを定義します。function growStruct s = struct("field1",5,"field2",2); s(end+1) = s; end
cell 配列の制限事項
{end+1} を使用して cell 配列を拡張する場合は、次の追加の考慮事項が適用されます。
MATLAB Function ブロックでは、
forループで{end+1}を使用して cell 配列を拡張することはできません。コード生成時には可変サイズの列ベクトルであるが、実行時にはスカラーである cell 配列を拡張するために
{end+1}を使用した場合、生成された MEX 関数ではエラーは発生しません。代わりに、2 要素の列ベクトルが生成されます。これは、生成されたコードの出力が MATLAB の出力と異なることを意味します。実行時にスカラーとして初期化される可変サイズの列 cell 配列の拡張を参照してください。{end+1}は変数でのみ使用できます。添字を使用してアクセスする cell 配列要素を拡張するために{end+1}を使用することはできません。たとえば、次の関数のコード生成は失敗します。function X = growCellError X = {'a' {1 2 3}}; X{2}{end+1} = 4; end
代わりに、cell 配列を変数に代入し、その変数に対して
{end+1}を呼び出します。たとえば、次の関数のコード生成は成功します。function X = growCellExample ca = {1 2 3}; ca{end+1} = 4; X = {'a' ca}; end
複数の出力を返す関数から代入する際に
{end+1}を使用することはできません。たとえば、次の関数のコード生成は失敗します。function [A,B] = growDeal(A,B) [A{end+1} B{end+1}] = deal(4,5); end
大かっこ内で
{end+1}を使用して値を代入することはできません。たとえば、次の関数のコード生成は失敗します。function [A,B] = growBracket{A,x) [A{end+1}] = x; end
{end+1}を使用してループ内の cell 配列を拡張するには、cell 配列は可変サイズでなければなりません。可変サイズにできるのは同種の cell 配列のみであるため、cell 配列も同種でなければなりません。これは、配列のすべての要素が同じプロパティをもつことを意味します。cell 配列のコード生成 (MATLAB Coder)を参照してください。たとえば、次の関数のコード生成は、
Xが同種であるため成功します。function out = growHomogenous(n) X = {1 2}; for i = 1:n X{end+1} = 2+i; end out = X; end
しかし、次の関数のコード生成は、
Yが異種であるため失敗します。function out = growHeterogeneous(n) Y = {1 'a' 2 'b'}; for i = 1:n Y{end+1} = 2+i; end out = Y; end
参考
トピック
- Generate Code for Variable-Size Arrays (MATLAB Coder)
- 実行時にスカラーとして初期化される可変サイズの列配列の拡張 (MATLAB Coder)
- コード生成時の可変サイズのサポートに関する MATLAB との非互換性 (MATLAB Coder)