最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

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 ブロックでは、可変サイズの入力または出力の信号を宣言するには、[端子とデータの管理] を使用します。可変サイズ入出力の宣言 (Simulink)を参照してください。coder.varsize 宣言で上限を指定する場合、その上限は [端子とデータの管理] の上限と一致しなければなりません。

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

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

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

すべて折りたたむ

変数が使用 (読み取り) された後で変数のサイズを変更すると、サイズ不一致エラーが起こる可能性があります。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 が、2 番目の次元が上限 20 の可変サイズである行ベクトルであると指定します。

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

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

A が、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 配列です。各要素の 1 番目の次元は 1 で固定です。各要素の 2 番目の次元は、上限 3 の可変サイズです。

cell 配列 C の要素が固定サイズの 1 番目の次元と上限が 5 の可変サイズの 2 番目の次元をもつベクトルであると指定します。

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

入力引数

すべて折りたたむ

可変サイズであると宣言する変数の名前。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 を使用して、入力引数が可変サイズであることを指定します。または、アプリの [入力の型を定義] ステップを使用して、エントリポイント関数の入力引数が可変サイズであることを指定します。

    • 関数がエントリポイント関数ではない場合、呼び出す関数で、呼び出される関数の入力となる変数について 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

  • coder.varsize 以下についてはサポートされていません。

    • グローバル変数

    • MATLAB クラスまたはクラス プロパティ

    • string スカラー

詳細

すべて折りたたむ

大きさが 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])

    メモ

    MATLAB Function ブロックに対しては、サイズが 1 の入力信号または出力信号が可変サイズをもつと指定することはできません。

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

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

R2011a で導入