Main Content

coder.const

生成コードでの定数への式の畳み込み

説明

out = coder.const(expression)expression を評価して、out を生成コード内の評価の結果で置き換えます。

[out1,...,outN] = coder.const(handle,arg1,...,argN) はハンドル handle をもつ多出力関数を評価します。そして out1,...,outN を生成されたコードでの評価の結果で置き換えます。handle が 0 個の入力を受け入れ、0 個または 1 個の出力を返す場合の coder.const の動作については、ヒント (MATLAB Coder)を参照してください。

すべて折りたたむ

この例では、coder.const を使用して、生成コードで定数を指定する方法を示します。

入力 Shift を取り、それをベクトルの要素に追加する関数 AddShift を記述します。ベクトルは、最初の 10 個の自然数の二乗から構成されます。AddShift はこのベクトルを生成します。

function y = AddShift(Shift) %#codegen
y = (1:10).^2+Shift;

codegen コマンドを使用して、AddShift のコードを生成します。コード生成レポートを開きます。

codegen -config:lib -launchreport AddShift -args 0

コード ジェネレーターは、ベクトルを作成するコードを生成します。ベクトル作成中に Shift をベクトルの各要素に追加します。生成コードでの AddShift の定義は以下のようになります。

void AddShift(double Shift, double y[10])
{
  int k;
  for (k = 0; k < 10; k++) {
    y[k] = (double)((1 + k) * (1 + k)) + Shift;
  }
}

(1:10).^2coder.const((1:10).^2) で置き換え、それから codegen コマンドを使用して AddShift のコードを再度生成します。コード生成レポートを開きます。

codegen -config:lib -launchreport AddShift -args 0

コード ジェネレーターは最初の 10 個の自然数の二乗を含むベクトルを作成します。生成されたコードでは、Shift をこのベクトルの各要素に追加します。生成コードでの AddShift の定義は以下のようになります。

void AddShift(double Shift, double y[10])
{
  int i;
  static const signed char iv[10] = { 1, 4, 9, 16, 25, 36, 
                                 49, 64, 81, 100 };

  for (i = 0; i < 10; i++) {
    y[i] = (double)iv[i] + Shift;
  }
}

この例では、生成コードで定数にユーザー記述関数を畳み込む方法を示します。

入力 index を取り、正弦波のルックアップ テーブルから index によって参照される要素を返す関数 getsine を記述します。関数 getsine は別の関数 gettable を使用して、ルックアップ テーブルを作成します。

function y = getsine(index) %#codegen
  assert(isa(index, 'int32'));
  persistent tbl;
  if isempty(tbl)
           tbl = gettable(1024);
  end
  y = tbl(index);

function y = gettable(n)
      y = zeros(1,n);
      for i = 1:n
         y(i) = sin((i-1)/(2*pi*n));
      end

int32 の引数を使用して getsine のコードを生成します。コード生成レポートを開きます。

codegen -config:lib -launchreport getsine -args int32(0)

生成されたコードにはルックアップ テーブルを作成するための手順が含まれています。

以下のステートメント

tbl = gettable(1024);

を次に置き換えます。

tbl = coder.const(gettable(1024));

int32 の引数を使用して getsine のコードを生成します。コード生成レポートを開きます。

生成コードにはルックアップ テーブル自体が含まれています。coder.const は、コード生成中に強制的に式 gettable(1024) が評価されるようにします。生成コードには評価の手順は含まれません。評価の結果自体が生成コードに含まれます。

この例では、coder.const ステートメントの多出力関数を使用して、生成コードで定数を指定する方法を示します。

入力 factor を取り、2 つのベクトル vec1 および vec2 のすべての要素に factor を乗算する関数 MultiplyConst を記述します。関数は別の関数 EvalConsts を使用して vec1 および vec2 を生成します。

function [y1,y2] = MultiplyConst(factor) %#codegen
  [vec1,vec2]=EvalConsts(pi.*(1./2.^(1:10)),2);
  y1=vec1.*factor;
  y2=vec2.*factor;

function [f1,f2]=EvalConsts(z,n)
  f1=z.^(2*n)/factorial(2*n);
  f2=z.^(2*n+1)/factorial(2*n+1);

codegen コマンドを使用して、MultiplyConst のコードを生成します。コード生成レポートを開きます。

codegen -config:lib -launchreport MultiplyConst -args 0

コード ジェネレーターは、ベクトルを作成するコードを生成します。

以下のステートメント

[vec1,vec2]=EvalConsts(pi.*(1./2.^(1:10)),2);

を次に置き換えます。

[vec1,vec2]=coder.const(@EvalConsts,pi.*(1./2.^(1:10)),2);

codegen コマンドを使用して、MultiplyConst のコードを生成します。コード生成レポートを開きます。

codegen -config:lib -launchreport MultiplyConst -args 0
コード ジェネレーターはベクトルを作成するコードを生成しません。代わりに、ベクトルを計算して、計算されたベクトルを生成コードで指定します。

この例では、coder.const を使用して外部関数を呼び出す方法を示します。

以下のステートメントを含む XML ファイル MyParams.xml を記述します。

<params>
    <param name="hello" value="17"/>
    <param name="world" value="42"/>
</params>

MyParams.xml を現在のフォルダーに保存します。

XML ファイルを読み取る MATLAB® 関数 xml2struct を記述します。関数は別のタグ params の内側にある XML タグ param を指定します。

param を指定してから、関数はその属性 name の値を構造体 s のフィールド名に割り当てます。また関数は、属性 value の値をフィールドの値に割り当てます。

function s = xml2struct(file)

s = struct();
doc = xmlread(file);
els = doc.getElementsByTagName('params');
for i = 0:els.getLength-1
    it = els.item(i);
    ps = it.getElementsByTagName('param');
    for j = 0:ps.getLength-1
        param = ps.item(j);
        paramName = char(param.getAttribute('name'));
        paramValue = char(param.getAttribute('value'));
        paramValue = evalin('base', paramValue);
        s.(paramName) = paramValue;        
    end
end

xml2struct を現在のフォルダーに保存します。

関数 xml2struct を使用して XML ファイル MyParams.xml を構造体 s に読み取る MATLAB 関数 MyFunc を記述します。coder.extrinsic を使用して xml2struct を外部として宣言して、それを coder.const ステートメントで呼び出します。

function y = MyFunc(u) %#codegen
  assert(isa(u, 'double'));
  coder.extrinsic('xml2struct');
  s = coder.const(xml2struct('MyParams.xml'));
  y = s.hello + s.world + u;

codegen コマンドを使用して、MyFunc のコードを生成します。コード生成レポートを開きます。

codegen -config:dll -launchreport MyFunc -args 0

コード ジェネレーターは、コード生成中に xml2struct の呼び出しを実行します。生成コードで構造体フィールド s.hello および s.world を値 17 および 42 で置き換えます。

入力引数

すべて折りたたむ

MATLAB 式またはユーザー定義の単出力関数。

式にはコンパイル時の定数のみが含まれていなければなりません。関数は定数の引数のみを与えなければなりません。たとえば、以下のコードがコード生成エラーとなるのは、x がコンパイル時の定数ではないためです。

function y=func(x)
   y=coder.const(log10(x));

エラーを修正するには、x を MATLAB コード内の定数に割り当てます。または、コード生成中に coder.Constant を使用して以下のように入力型を定義します。

codegen -config:lib func -args coder.Constant(10)

例: 2*pi, factorial(10)

組み込み関数またはユーザー記述関数へのハンドル。

例: @log, @sin

データ型: function_handle

ハンドル handle をもつ関数への引数。

引数はコンパイル時の定数でなければなりません。たとえば、以下のコードがコード生成エラーとなるのは、x および y がコンパイル時の定数ではないためです。

function y=func(x,y)
   y=coder.const(@nchoosek,x,y);

エラーを修正するには、x および y を MATLAB コード内の定数に割り当てます。または、コード生成中に coder.Constant を使用して以下のように入力型を定義します。

codegen -config:lib func -args {coder.Constant(10),coder.Constant(2)}

出力引数

すべて折りたたむ

expression の値。生成コードでは、MATLAB Coder™ は出現した outexpression の値で置き換えます。

ハンドル handle をもつ関数の出力。MATLAB Coder は関数を評価して、出現した out1,...,outN を生成コード内の定数で置き換えます。

ヒント

  • コード ジェネレーターは、可能な場合は定数に式を自動的に畳み込みます。通常、自動定数畳み込みはスカラーを使用した式についてのみ行われます。コード ジェネレーターがそれ自体で定数への式の畳み込みを行わない場合は、coder.const を使用します。

  • コードの生成時間を短くするために、計算量の多い関数呼び出しの定数畳み込みを行う場合は、関数呼び出しを外部にします。外部関数呼び出しでは、コード ジェネレーターの代わりに MATLAB により関数呼び出しが評価されます。以下に例を示します。

    function j = fcn(z)
    zTable = coder.const(0:0.01:100);
    jTable = coder.const(feval('besselj',3,zTable));
    j = interp1(zTable,jTable,z);
    end

    外部関数呼び出しでの coder.const の使用 (MATLAB Coder)を参照してください。

  • coder.const が関数呼び出しの定数畳み込みを実行できない場合、関数呼び出しを外部にして定数畳み込みを実行します。外部関数呼び出しでは、コード ジェネレーターの代わりに MATLAB により関数呼び出しが評価されます。以下に例を示します。

    function yi = fcn(xi)
    y = coder.const(feval('rand',1,100));
    yi = interp1(y,xi);
    end

    外部関数呼び出しでの coder.const の使用 (MATLAB Coder)を参照してください。

  • 0 個の入力および 0 個または 1 個の出力をもつ関数ハンドルで coder.const を呼び出すとします。以下に例を示します。

    out = coder.const(@fcn);
    このような場合、コード ジェネレーターは fcn を評価せず、out を関数ハンドル @fcn 自体に設定します。この特殊な場合に fcn の評価を強制するには、coder.const コマンド内で関数を明示的に呼び出します。以下に例を示します。
    out = coder.const(fcn());

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

GPU コード生成
GPU Coder™ を使用して NVIDIA® GPU のための CUDA® コードを生成します。

バージョン履歴

R2013b で導入