coder.const
生成コードでの定数への式の畳み込み
説明
は 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; } }
式 (1:10).^2
を coder.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
XML ファイルの処理による定数の読み取り
この例では、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 で置き換えます。
入力引数
expression
— MATLAB 式またはユーザー記述関数
定数を含む式 | 定数引数をもつ単出力関数
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)
handle
— 関数ハンドル
関数ハンドル
組み込み関数またはユーザー記述関数へのハンドル。
例: @log
, @sin
データ型: function_handle
arg1,...,argN
— ハンドル 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)}
出力引数
out
— expression
の値
評価された式の値
expression
の値。生成コードでは、MATLAB Coder™ は出現した out
を expression
の値で置き換えます。
out1,...,outN
— ハンドル handle
をもつ関数の出力
ハンドル handle
をもつ関数の出力の値
ハンドル 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)を参照してください。
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
GPU コード生成
GPU Coder™ を使用して NVIDIA® GPU のための CUDA® コードを生成します。
バージョン履歴
R2013b で導入
参考
トピック
- 関数呼び出しの定数への畳み込み (MATLAB Coder)
- 外部関数呼び出しでの coder.const の使用 (MATLAB Coder)
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)