メインコンテンツ

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

参考

(MATLAB Coder) |

トピック