Main Content

coder.varsize

可変サイズのデータの宣言

説明

coder.varsize(varName1,...,varNameN) は、varName1,...,varNameN という名前の変数が可変サイズをもつことを宣言します。この宣言により、コード ジェネレーターは、その変数が、生成されたコードの実行中にサイズを変更できるようにします。この構文では、変数の次元の上限を指定することも、どの次元がサイズを変更できるかを指定することもありません。コード ジェネレーターが上限を計算します。大きさが 1 の次元を除くすべての次元がサイズを変更できます。

これらの制限とガイドラインに従って coder.varsize を使用します。

  • コード生成用の MATLAB® 関数内の coder.varsize を使用します。

  • coder.varsize 宣言は、変数の初回の使用よりも前になければなりません。以下に例を示します。

    ...
    x = 1;
    coder.varsize('x');
    disp(size(x));
    ...

  • coder.varsize を使用して、出力引数が可変サイズであること、またはサイズ不一致エラーに対応することを宣言します。または、可変サイズのデータを定義するには、コード生成のための可変サイズ データの定義で説明している方法を使用します。

メモ

MATLAB Function ブロックでは、可変サイズの出力変数を宣言するには、[シンボル] ペインとプロパティ インスペクターを使用します。可変サイズの MATLAB Function ブロック変数の宣言を参照してください。coder.varsize 宣言で上限を指定する場合、その上限はプロパティ インスペクターの上限と一致しなければなりません。

制限およびガイドラインの詳細については、制限およびヒントを参照してください。

coder.varsize(varName1,...,varNameN,ubounds) は、変数の各次元の上限も指定します。すべての変数が同じ数の次元をもっていなければなりません。大きさが 1 の次元を除くすべての次元がサイズを変更できます。

coder.varsize(varName1,...,varNameN,ubounds,dims) はまた、変数の各次元の上限と、各次元が固定サイズであるか可変サイズであるかを指定します。ある次元が固定サイズである場合、対応する ubound 要素がその次元の固定サイズを指定します。すべての変数が同じ固定サイズの次元と同じ可変サイズの次元をもちます。

コード ジェネレーターでは、コロンの接頭辞を使用して可変サイズの次元を示します。たとえば、配列 A のサイズが 3x:5x:Inf と示される場合は次のようになります。

  • 1 番目の次元は固定サイズ 3

  • 2 番目の次元は可変サイズで上限が 5

  • 3 番目の次元は可変サイズで制限なし

すべて折りたたむ

変数が使用 (読み取り) された後で変数のサイズを変更すると、サイズ不一致エラーが起こる可能性があります。coder.varsize を使用して、変数のサイズが変わる可能性があることを指定します。

次の関数のコード生成はサイズ不一致エラーを起こします。x = 1:10x の 2 番目の次元のサイズを、x を使用する行 y = size(x) の後で変更するためです。

function [x,y] = usevarsize(n)
%#codegen
x = 1;
y = size(x);
if n > 10
    x = 1:10;
end

x がサイズ変更可能であることを宣言するには、coder.varsize を使用します。

function [x,y] = usevarsize(n)
%#codegen
x = 1;
coder.varsize('x');
y = size(x);
if n > 10
    x = 1:10;
end

y = size(x) を削除すると、coder.varsize 宣言は不要となります。x はサイズ変更の前に使用されないためです。

A をサイズ 1x:20 の行ベクトルと指定します。これは、A の 2 番目の次元が上限 20 の可変サイズであることを示します。

function fcn()
...
coder.varsize('A',[1 20]);
...
end

dims を指定しないと、大きさが 1 の次元を除くすべての次元が可変サイズとなります。

A をサイズ 3x:20 の配列と指定します。これは、1 番目の次元が固定サイズ 3 で、2 番目の次元が上限 20 の可変サイズであることを示します。

function fcn()
...
coder.varsize('A',[3 20], [0 1] );
...
end

この関数で、ステートメント coder.varsize('data.values') は、data の各要素内のフィールド values が可変サイズであることを宣言します。

function y = varsize_field()
%#codegen

d = struct('values', zeros(1,0), 'color', 0);
data = repmat(d, [3 3]);
coder.varsize('data.values');

for i = 1:numel(data)
    data(i).color = rand-0.5;
    data(i).values = 1:i;
end

y = 0;
for i = 1:numel(data)
    if data(i).color > 0
        y = y + sum(data(i).values);
    end
end

cell 配列 C が固定サイズの 1 番目の次元と、上限 3 の可変サイズの 2 番目の次元をもつと指定します。coder.varsize 宣言は C の初回の使用より前でなければなりません。

...
C = {1 [1 2]};
coder.varsize('C', [1 3], [0 1]);
y = C{1};
...
end

coder.varsize 宣言がない場合、C は、要素が同じクラスで異なるサイズの異種混合 cell 配列です。coder.varsize 宣言がある場合、C は、要素が同じクラスで同じ最大サイズの同種 cell 配列です。

  • cell 配列 C のサイズは 1x:3 です。コロンは、C の 2 番目の次元が上限 3 の可変サイズであることを示します。

  • C の各要素は 1x:2 の配列です。

cell 配列 C の要素を 1x:5 のベクトルと指定します。これは、各要素の 1 番目の次元が固定サイズで、2 番目の次元が上限 5 の可変サイズであることを示します。

...
C = {1 2 3};
coder.varsize('C{:}', [1 5], [0 1]);
C = {1, 1:5, 2:3};
...

cell 配列の特定の要素を可変サイズとして指定することもできます。たとえば、1 行 3 列の cell 配列 x で、最初の要素 x{1}1x:10 の行ベクトルと宣言します。

...
x = {1,2,3};
coder.varsize('x{1}', [1 10]);
...

入力引数

すべて折りたたむ

可変サイズであると宣言する変数の名前。1 つ以上の文字ベクトルまたは string スカラーとして指定します。

例: coder.varsize('x','y')

配列の次元の上限。整数定数のベクトルとして指定します。

ubounds を指定しない場合、コード ジェネレーターは各変数について上限を計算します。ubounds 要素が固定サイズの次元に対応する場合、値はその次元の固定サイズです。

例: coder.varsize('x','y',[1 2])

各次元が固定サイズか可変サイズかを示す指標。論理ベクトルとして指定します。dims で 0 または false に対応する次元は固定サイズです。1 または true に対応する次元は可変サイズです。

dims を指定しない場合、大きさが 1 の次元を除き、次元は可変サイズです。

例: coder.varsize('x','y',[1 2], [0 1])

制限

  • coder.varsize 宣言により、コード ジェネレーターは変数のサイズが変化することを可能にするよう指示を受けます。これは変数のサイズを変更しません。たとえば、以下のコードについて考えます。

    ...
    x = 7;
    coder.varsize('x', [1,5]);
    disp(size(x));
    ...

    coder.varsize 宣言の後、x はまだ 1 行 1 列の配列です。x の現在のサイズを超えて要素に値を代入することはできません。たとえば、このコードは、インデックスの 3 が x の次元を超えるため、実行時エラーとなります。

    ...
    x = 7;
    coder.varsize('x', [1,5]);
    x(3) = 1;
    ...

  • coder.varsize は関数の入力引数ではサポートされません。代わりに、次のようにします。

    • 関数がエントリポイント関数である場合、コマンド ラインで coder.typeof (MATLAB Coder) を使用して、入力引数が可変サイズであることを指定します。または、アプリの [入力の型を定義] ステップを使用して、エントリポイント関数の入力引数が可変サイズであることを指定します。

    • 関数がエントリポイント関数ではない場合、呼び出す関数で、呼び出される関数の入力となる変数について coder.varsize を使用します。

  • スパース行列の場合、coder.varsize は可変サイズの次元の上限を下げます。

  • cell 配列で coder.varsize を使用する際の制限は次のようになります。

    • cell 配列は、同種である場合に限り、可変サイズとすることができます。異種混合 cell 配列で coder.varsize を使用する場合、コード ジェネレーターは同種の cell 配列を作成しようとします。コード ジェネレーターは cell 配列のすべての要素に適用されるクラスとサイズを見つけようとします。たとえば、cell 配列 c = {1, [2 3]} について考えます。両方の要素が、1 番目の次元が 1 の固定サイズで 2 番目の次元が上限 2 の可変サイズである double 型で表すことができます。コード ジェネレーターが共通のクラスと最大サイズを見つけられない場合、コード生成に失敗します。たとえば、cell 配列 c = {'a',[2 3]} について考えます。1 番目の要素が char で 2 番目の要素が double であるため、コード ジェネレーターは両方の要素を表すことができるクラスを見つけられません。

    • 関数 cell を使用して固定サイズの cell 配列を定義する場合、coder.varsize を使用して、cell 配列が可変サイズであることを指定することはできません。たとえば、以下のコードでは、x = cell(1,3) により x が固定サイズの 1 行 3 列の cell 配列になるため、コード生成エラーが発生します。

      ...
      x = cell(1,3);           
      coder.varsize('x',[1 5])
      ...

      中かっこを使用して定義した cell 配列と共に coder.varsize を使用できます。以下に例を示します。

      ...
      x = {1 2 3}; 
      coder.varsize('x',[1 5])
      ...

    • 関数 cell を使用して可変サイズの cell 配列を作成するには、以下のコード パターンを使用します。

      function mycell(n)
      %#codegen
      x = cell(1,n);   
      for i = 1:n
          x{i} = i;
      end
      end

      cell を使用した可変サイズの cell 配列の定義を参照してください。

      cell 配列の上限を指定するには、coder.varsize を使用します。

      function mycell(n)
      %#codegen
      x = cell(1,n);   
      for i = 1:n
          x{i} = i;
      coder.varsize('x',[1,20]);
      end
      end

詳細

すべて折りたたむ

大きさが 1 の次元

size(A,dim) = 1 である次元。

ヒント

  • コード生成レポートまたは MATLAB 関数レポートで、コロン (:) は、次元が可変サイズをもつことを示します。たとえば 1x:2 のサイズは、1 番目の次元が 1 の固定サイズをもち、2 番目の次元が上限が 2 の可変サイズをもつことを示します。

  • coder.varsize を使用して次元の上限が 1 であることを指定すると、既定で、次元は 1 の固定サイズをもちます。次元が 0 (空の配列) または 1 になりうると指定するには、引数 dims の対応する要素を true に設定します。たとえば、このコードは x の 1 番目の次元が 1 の固定サイズをもち、他の次元が 5 の可変サイズをもつことを指定します。

    coder.varsize('x',[1,5,5])

    対照的に、このコードは x の 1 番目の次元 1 の上限をもち、可変サイズ (0 または 1) をもつことを指定します。

    coder.varsize('x',[1,5,5],[1,1,1])

  • 入力変数、または入力変数を使用した計算の結果を使用して配列のサイズを指定する場合、入力変数は生成コードで可変サイズとして宣言されます。サイズの上限も指定する場合を除いて、配列で coder.varsize を再使用しないでください。

  • coder.varsize 宣言で上限を指定せず、コード ジェネレーターが上限を決定できない場合、生成されたコードでは動的メモリ割り当てを使用します。動的メモリ割り当ては生成されたコードの速度を低下させる可能性があります。動的メモリ割り当てを回避するには、ubounds 引数を指定して上限を指定します。

バージョン履歴

R2011a で導入