ドキュメンテーション センター

  • 評価版
  • 製品アップデート

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

coder.varsize

パッケージ: coder

可変サイズ データの宣言

構文

coder.varsize('var1', 'var2', ...)
coder.varsize('var1', 'var2', ..., ubound)
coder.varsize('var1', 'var2', ..., ubound, dims)
coder.varsize('var1', 'var2', ..., [], dims)

説明

coder.varsize('var1', 'var2', ...) は、1 つまたは複数の変数を可変サイズ データとして宣言し、これによって、その後の割り当てのサイズが拡張可能になります。各 'varn' は、変数または構造体フィールドを表す引用符で囲まれた文字列でなければなりません。構造体のフィールドが構造体の配列に属している場合は、コロン (:) をインデックス式として使用し、配列のすべての要素のフィールドを可変サイズにします。たとえば、式 coder.varsize('data(:).A') は、data の各要素内のフィールド A が可変サイズであることを宣言します。

coder.varsize('var1', 'var2', ..., ubound) は、1 つまたは複数の変数が、ubound で指定された明示的上限をもつ可変サイズ データであることを宣言します。引数 ubound は、各 'varn' のすべての次元に対する上限サイズの定数の整数値ベクトルでなければなりません。複数の 'varn' を指定する場合、各変数の次元は同数でなければなりません。

coder.varsize('var1', 'var2', ..., ubound, dims) は、1 つまたは複数の変数が、dims で指定された明示的上限と、固定および可変の混合の次元をもつ可変サイズ データであることを宣言します。引数 dims は、論理ベクトルまたは 0 と 1 のみを含んだ double のベクトルです。dims 内の 0 または false に対応する次元は固定サイズで、1 または true に対応する次元は可変サイズです。複数の変数を指定する場合、各固定次元はすべての 'varn' で同じ値でなければなりません。

coder.varsize('var1', 'var2', ..., [], dims) は、1 つまたは複数の変数が固定および可変の混合の次元をもつ可変サイズであることを宣言します。空ベクトル [] は、明示的な上限を指定しないことを意味します。

ubound"指定しない" 場合は、生成コード内の各 'varn' について上限が計算されます。

dims を指定 "しない" 場合、大きさが 1 の次元を除く次元が可変と想定されます。大きさが 1 の次元とは、size(A,dim) = 1 になる次元です。

'varn' が使用される (読み取られる) 前に、coder.varsize 宣言を追加しておかなければなりません。各 'varn' への最初の割り当ての前に、宣言を追加することができます。

coder.varsize をグローバル変数に適用することはできません。

coder.varsize は、MATLAB® クラス プロパティではサポートされていません。

コード生成に使用する MATLAB 関数の外部で coder.varsize は使用できません。たとえば、以下のコードでは変数 var が可変サイズ データとして宣言されていません。

coder.varsize('var',10);
codegen -config:lib MyFile -args var

代わりに、MyFilecoder.varsize ステートメントを含めることで var を可変サイズ データとして宣言します。または、coder.typeof を使用して、MyFile 外部で var を可変サイズとして宣言します。そして -args オプションを使用して、コード生成中に MyFile に渡されます。詳細は、coder.typeofを参照してください。

すべて展開する

実行時のデータの追加と取り出しによりサイズが最高 32 要素まで変化する単純スタックを開発します。

スタックにデータを追加するコマンド (push) とスタックからデータを取り出すコマンド (pop) を発行する基本関数 test_stack を記述します。

function test_stack %#codegen
    % The directive %#codegen indicates that the function
    % is intended for code generation
    stack('init', 32);
    for i = 1 : 20
        stack('push', i);
    end
    for i = 1 : 10
        value = stack('pop');
        % Display popped value
        value
    end
end

push および pop コマンドを実行するローカル関数 stack を記述します。

function y = stack(command, varargin)
    persistent data;
    if isempty(data)
        data = ones(1,0);
    end
    y = 0;
    switch (command)
    case {'init'}
        coder.varsize('data', [1, varargin{1}], [0 1]);
        data = ones(1,0);
    case {'pop'}
        y = data(1);
        data = data(2:size(data, 2));
    case {'push'}
        data = [varargin{1}, data];
    otherwise
        assert(false, ['Wrong command: ', command]);
    end
end

変数 data はスタックです。ステートメント coder.varsize('data', [1, varargin{1}], [0 1]) は、以下を宣言しています。

  • data は行ベクトルである

  • 最初の次元は固定サイズである

  • 2 番目の次元は 32 の上限まで拡張可能である

test_stack の MEX 関数を生成します。

codegen -config:mex test_stack

codegen は現在のフォルダーに MEX 関数を生成します。

test_stack を実行すると、以下の結果が得られます。

value =
    20

value =
    19

value =
    18

value =
    17

value =
    16

value =
    15

value =
    14

value =
    13

value =
    12

value =
    11

実行時にスタックのアイテム数が 0 から 20 に拡大し、その後 10 まで縮小しています。

可変サイズの構造体フィールドを宣言します。

配列 data を宣言する関数 struct_example を記述します。ここで、各要素は可変サイズのフィールドを含んだ構造体です。

function y=struct_example() %#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

ステートメント coder.varsize('data(:).values') は、行列 data の各要素内の values フィールドを可変サイズとして指定します。

struct_example の MEX 関数を生成します。

codegen -config:mex struct_example

struct_example を実行します。

この関数は乱数を配列に読み込むので、struct_example を実行するたびに異なる解が得られます。

詳細

すべて展開する

ヒント

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

  • 配列に対して明示的な上限なしで coder.varsize を使用すると、配列の動的メモリ割り当てが発生します。これにより、生成コードの速度が遅くなることがあります。これを回避するには、(事前に分かっている場合は) 構文 coder.varsize('var1', 'var2', ..., ubound) を使用して、配列サイズの上限を指定します (事前に分かっている場合)。

参考

| |

この情報は役に立ちましたか?