coder.replace 関数を使用して MATLAB 関数をカスタム コードに置換
coder.replace 関数を含む MATLAB 関数のパフォーマンスを最適化するために、コード置換ライブラリを開発できます。コード置換ライブラリを開発するには、対話的な方法またはプログラムによる方法のいずれかを使用します。詳細については、コード置換ライブラリの開発を参照してください。
対話的なコード置換ライブラリの開発
MATLAB コマンド ラインから次のコマンドを使用して コード置換ツール (crtool) を開きます。
>>crtool
table を作成します。
コード置換ツールのツールストリップから、[新規] 、 [テーブル] をクリックします。
右側のペインで、table に
crl_matlab_fcn_coder_replaceと名前を付けます。[適用] をクリックします。
エントリを作成します。[新規] 、 [エントリ] 、 [関数エントリ] をクリックします。
エントリ パラメーターを作成します。[関数] ドロップダウン リストで、
[Custom]を選択します。関数の情報が crtool に表示されます。この例では、パラメーターをcalculateとして指定します。概念表現を作成します。概念表現は、置換する関数のシグネチャを記述します。crtool の [概念関数] サブセクションで、double の [データ型] およびスカラーの [引数タイプ] をもつ戻り引数 y1 と入力引数 u1 を追加します。
実装表現を作成します。実装表現は最適化関数のシグネチャを記述します。この例では、概念引数と同じ順序およびプロパティをもつ実装引数を指定するために、引数
y1およびu1を追加して [概念引数と実装引数のタイプを同じにする] チェック ボックスをオンにします。置換関数の [名前] に
replacement_calculate_implを指定します。ビルド情報を指定します。[ビルド情報] タブをクリックして、ビルド要件のペインを開きます。コード ジェネレーターがコード置換に必要なファイル (ソース、ヘッダー、オブジェクト) を指定します。この例では、ビルド情報を指定する必要はありません。
table を確認して保存します。[マッピング情報] タブをクリックし、フィールドが以下に示すように入力されていることを確認します。[適用] をクリックし、[エントリの検証] をクリックします。ツールストリップで [保存] をクリックして table を保存します。

コード置換ライブラリを登録します。登録することにより、指定した table で構成されるライブラリが作成されます。[登録ファイルの作成] をクリックします。[登録ファイルの作成] ダイアログ ボックスで、以下のフィールドに入力します。
レジストリ名 —
CRL for Matlab Fcn replaced with custom code using coder.replaceテーブル リスト —
crl_matlab_fcn_coder_replace基本 CRL —
Noneターゲット HW デバイス —
*説明 —
Example code replacement library

[OK] をクリックします。コード置換ライブラリを使用するには、現在の MATLAB セッションを次のコマンドで更新します。
>>RTW.TargetRegistry.getInstance('reset');コード置換ライブラリを確認します。MATLAB コマンド ラインから、コード置換ビューアーを使用してライブラリを開き、table およびエントリが正しく指定されていることを確認します。詳細については、Verify Code Replacement Libraryを参照してください。コード置換ライブラリを使用するようにモデルを構成し、コードを生成して、その置換が予期したとおりに行われることを確認します。予期しない動作が行われた場合、ヒット ログとミス ログを調べて問題のトラブルシューティングを行います。
プログラムによるコード置換ライブラリの開発
[新規]、[関数] を選択し、[MATLAB] メニューからプログラム インターフェイスを開きます。
table を作成します。
引数をもたず table オブジェクトを返す、コード置換ライブラリ テーブルの名前をもつ関数を作成します。この関数を使用して、コード置換ライブラリ テーブルを呼び出すことができます。
RTW.TflTableを呼び出して table オブジェクトを作成します。
function hTable = crl_matlab_fcn_coder_replace % Create a function to call the code replacement library table %% Create a table object hTable = RTW.TflTable;
エントリを作成します。この例では関数を置き換えるため、エントリ関数
RTW.TflCFunctionEntryを呼び出して table にコード置換エントリを作成します。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;
エントリ パラメーターを作成します。この例では関数を置き換えるため、関数
setTflCFunctionEntryParametersを呼び出してエントリ パラメーターを作成します。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');
概念表現を作成します。概念表現は、置換する関数のシグネチャを記述します。引数プロパティを明示的に指定するには、関数
getTflArgFromStringを呼び出します。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);
実装表現を作成します。実装表現は最適化関数のシグネチャを記述します。実装引数が概念引数と同じ順序とプロパティをもつように指定するには、関数
getTflArgFromStringを呼び出します。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 Conceptual 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);
ビルド情報を指定します。エントリ パラメーターで、コード ジェネレーターがコード置換に必要なファイル (ソース、ヘッダー、オブジェクト) を指定します。この例では、ビルド情報は必要ありません。
カスタマイズ ファイルを確認して保存します。[MATLAB] メニューから、[ファイル]、[保存] を選択して、このカスタマイズ ファイルを保存します。コマンド ラインから、次のようにしてコード置換ライブラリ テーブルを呼び出し、確認します。
>> hTable = crl_matlab_fcn_coder_replace
コード置換ライブラリを登録します。登録では、ライブラリ名、コード置換テーブル、その他の情報を定義することにより、コード置換ライブラリが作成されます。以下の仕様を使用して登録ファイルを作成します。
function rtwTargetInfo(cm) cm.registerTargetInfo(@loc_register_crl); end function this = loc_register_crl this(1) = RTW.TflRegistry; this(1).Name = 'CRL for matlab function with custom code using coder.replace'; this(1).TableList = {'crl_matlab_fcn_coder_replace.m'}; % table created in this example this(1).TargetHWDeviceType = {'*'}; this(1).Description = 'Example code replacement library'; end
コード置換ライブラリを使用するには、現在の MATLAB セッションを次のコマンドで更新します。
>>RTW.TargetRegistry.getInstance('reset');コード置換ライブラリを確認します。MATLAB コマンド ラインから、コード置換ビューアーを使用してライブラリを開き、table およびエントリが正しく指定されていることを確認します。詳細については、Verify Code Replacement Libraryを参照してください。コード置換ライブラリを使用するようにモデルを構成し、コードを生成して、その置換が予期したとおりに行われることを確認します。予期しない動作が行われた場合、ヒット ログとミス ログを調べて問題のトラブルシューティングを行います。
MATLAB 関数をカスタム C コードに置換
MATLAB 関数をコード置換ライブラリに登録されているカスタム実装に置き換えます。
MATLAB 関数の記述
カスタム実装 repalcement_calculate_impl.c に置き換える MATLAB 関数を記述します。MATLAB 関数で、coder.replace を呼び出します。たとえば、関数 calculate を使用します。
type calculate.mfunction 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.mfunction 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.mfunction 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.
x と y のデータ型が 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));
}