ドキュメンテーション

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

coder.const

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

構文

  • out = coder.const(expression)
  • [out1,...,outN] = coder.const(handle,arg1,...,argN)

説明

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

[out1,...,outN] = coder.const(handle,arg1,...,argN) はハンドル handle をもつ多出力関数を評価します。そして out1,...,outN を生成されたコードでの評価の結果で置き換えます。

すべて折りたたむ

この例では、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;
  }
}

以下のステートメント

y = (1:10).^2+Shift;

を次に置き換えます。

y = coder.const((1:10).^2)+Shift;

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

codegen -config:lib -launchreport AddShift -args 0

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

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

  for (i0 = 0; i0 < 10; i0++) {
    y[i0] = (double)iv0[i0] + 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 を使用します。

R2013b で導入

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