メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

coder.replace

生成コード内で現在の MATLAB 関数実装をコード置換ライブラリ関数に置換

説明

coder.replace(ifNoReplacement) は、現在の関数実装をコード置換ライブラリ関数に置き換えます。

コード生成中に、MATLAB® 関数で coder.replace を呼び出すと、コード ジェネレーターはコード置換ライブラリのルックアップを実行して次の関数シグネチャを探します。

[y1_type,y2_type,...,yn_type]=fcn(x1_type,x2_type,...,xn_type)
入力データ型は x1_type, x2_type,...,xn_type で、実装から導出される出力型は y1_type, y2_type,..., yn_type です。登録されているコード置換ライブラリで MATLAB 関数との一致が見つかった場合、MATLAB 関数の内容は破棄され、コード置換ライブラリ関数の呼び出しに置き換えられます。一致が見つからない場合、コードは置換を行わずに生成されます。

coder.replace はコード生成にのみ影響するため、MATLAB コードまたは MEX 関数の生成を変更することはありません。coder.replace は、置換関数の実装と同等の動作を示す MATLAB 関数を置き換えるためのものです。MATLAB 関数本体が空であるか、置換関数の実装と同等でない場合は、生成コードから削除される可能性があります。シミュレーションには置換前の MATLAB 関数が使用されます。置換後のシミュレーションとコード生成の数値結果は自分で検証する必要があります。

すべて折りたたむ

MATLAB 関数をコード置換ライブラリに登録されているカスタム実装に置き換えます。

MATLAB 関数の記述

カスタム実装 repalcement_calculate_impl.c に置き換える MATLAB 関数を記述します。MATLAB 関数で、coder.replace を呼び出します。たとえば、関数 calculate を使用します。

type calculate.m
function y = calculate(x)
% Search in the code replacement library for replacement
% and use replacement function if available
% Error if not found
  coder.replace('-errorifnoreplacement');
  y = sqrt(x);
end

calculate を呼び出す MATLAB 関数 top_function を記述します。

type top_function.m
function out = top_function(in)
arguments
    in (1,1) double
end
  p = calculate(in);
  out = exp(p);
end

コード置換ライブラリの作成と登録

コード置換ライブラリ ファイル crl_matlab_fcn_coder_replace.m では、コード置換テーブルの関数エントリを記述します。置換関数 replacement_calculate_impl.c とヘッダー ファイル replacement_calculate_impl.h はパス上になければなりません。

type crl_matlab_fcn_coder_replace.m
function hTable = crl_matlab_fcn_coder_replace
% Create a function to call the code replacement library table 

%% Create a table object
hTable = RTW.TflTable;

%% Create an entry
hEntry = RTW.TflCFunctionEntry;

%% Create entry parameters
setTflCFunctionEntryParameters(hEntry, ...
  'Key','calculate', ...
  'Priority',100, ...
  'ArrayLayout','COLUMN_MAJOR', ...
  'ImplementationName', ...
  'replacement_calculate_impl', ...
  'ImplementationHeaderFile', ...
  'replacement_calculate_impl.h', ...
  'ImplementationSourceFile', ...
  'replacement_calculate_impl.c');

%% Create the conceptual representation
arg = getTflArgFromString(hEntry,'y1','double');
arg.IOType = 'RTW_IO_OUTPUT';
addConceptualArg(hEntry,arg);

arg = getTflArgFromString(hEntry,'u1','double');
addConceptualArg(hEntry,arg);

%% Create the implementation representation
arg = getTflArgFromString(hEntry,'y1','double');
arg.IOType = 'RTW_IO_OUTPUT';
hEntry.Implementation.setReturn(arg); 

arg = getTflArgFromString(hEntry,'u1','double');
hEntry.Implementation.addArgument(arg);

%% Add the entry to the table
hTable.addEntry(hEntry);

rtwTargetInfo ファイルはコード置換テーブルを登録します。たとえば、ファイル RTWTargetInfo-coder-replace.txt の内容を使用します。登録情報を更新するには、sl_refresh_customizations を呼び出します。

copyfile RTWTargetInfo-coder-replace.txt rtwTargetInfo.m
sl_refresh_customizations

コード置換ライブラリの適用とコードの生成

ライブラリ コード生成構成を作成し、その構成を使用して、作成したコード置換ライブラリを指定します。

configObj = coder.config('lib');
configObj.CodeReplacementLibrary = "CRL for matlab function with custom code using coder.replace";

コード生成構成を使用してコードを生成します。

codegen top_function.m -config configObj -c
Code generation successful.

xy のデータ型が double であるため、coder.replace はコード置換ライブラリで double = calculate(double) を検索します。一致が見つかった場合、codegen は置換関数 replacement_calculate_impl によって MATLAB 関数 calculate が置き換えられるコードを生成します。

file = fullfile("codegen/lib/top_function","top_function.c");
coder.example.extractLines(file,"double top_function(double in)","}",1,1);
double top_function(double in)
{
  return exp(replacement_calculate_impl(in));
}

入力引数

すべて折りたたむ

一致が見つからない場合にエラーまたは警告を生成するオプション。'-errorifnoreplacement' または '-warnifnoreplacement' として指定します。この引数を指定しなかった場合、コード ジェネレーターはエラーや警告を発行しません。

coder.replace('-errorifnoreplacement') は、現在の関数実装をコード置換ライブラリ関数に置き換えます。一致が見つからない場合、コード生成は停止します。コード置換ライブラリのルックアップに失敗したことを説明するエラー メッセージが生成されます。

coder.replace('-warnifnoreplacement') は、現在の関数実装をコード置換ライブラリ関数に置き換えます。一致が見つからない場合、コードは現在の関数に対して生成されます。コード生成中に、コード置換ライブラリのルックアップに失敗したことを説明する警告が生成されます。

例: coder.replace('-errorifnoreplacement')

ヒント

  • coder.replace には Embedded Coder® のライセンスが必要です。

  • coder.replace はコード生成関数であるため、MATLAB コードまたは MEX 関数の生成を変更することはありません。

  • coder.replace は、関数内で複数回呼び出すことを目的としていません。

  • coder.replace は、条件式およびループ内で使用することを目的としていません。

  • coder.replace では、コード置換ライブラリのルックアップ中の飽和モードと丸めモードはサポートされません。

  • coder.replace では、varargout はサポートされません。

  • coder.replace では、データ配置を必要とする関数の置換はサポートされません。

  • coder.replace では、可変サイズ入力をもつ MATLAB 関数の置換はサポートされません。

拡張機能

すべて展開する

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

バージョン履歴

R2012b で導入