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ブロックでは、可変サイズの入力または出力の信号を宣言するには、[端子とデータの管理] を使用します。可変サイズ入出力の宣言(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)%#codegenx = 1;y =大小(x);ifn > 10 x = 1:10;end

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

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

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

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

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

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

Aが、1 番目の次元が 3 の固定サイズで、2 番目の次元が上限 20 の可変サイズであると指定します。

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

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

functiony = varsize_field()%#codegend = struct('values', zeros(1,0),'color', 0); data = repmat(d, [3 3]); coder.varsize('data.values');fori = 1:numel(data) data(i).color = rand-0.5; data(i).values = 1:i;endy = 0;fori = 1:numel(data)ifdata(i).color > 0 y = y + sum(data(i).values);endend

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])...

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

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

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

      functionmycell(n)%#codegenx = cell(1,n);fori = 1:n x{i} = i;endend

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

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

      functionmycell(n)%#codegenx = cell(1,n);fori = 1:n x{i} = i; coder.varsize('x',[1,20]);endend

  • 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 で導入