Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

coder.extrinsic

外部として関数を宣言し MATLAB で実行

説明

coder.extrinsic(function)function を外部関数として宣言します。コード ジェネレーターは外部関数の本体のコードを生成せず、代わりに MATLAB® エンジンを使用して呼び出しを実行します。この機能は、実行時に MATLAB エンジンが使用可能な場合にのみ使用できます。MATLAB エンジンが使用可能な状況の例としては、MEX 関数の実行、Simulink® シミュレーション、またはコード生成時 ("コンパイル時" とも呼ばれる) の関数呼び出しが挙げられます。

スタンドアロン コードの生成中に、コード ジェネレーターは外部関数が呼び出し元の関数の出力に影響を与えるかどうか判断しようとします。たとえば、出力変数に mxArrays を返すことによって、これを実行します。出力に変化がない場合、コード ジェネレーターはコード生成を進めますが、生成コードから外部関数を除外します。影響する場合、コンパイル エラーが発生します。

coder.extrinsic を使用して外部関数として宣言した関数では、coder.ceval を使用することはできません。

コード生成の範囲外では、関数 coder.extrinsic は無視されます。

メモ

コード ジェネレーターでは、plotdispfigure など、多くの MATLAB 可視化関数が外部関数として自動的に処理されます。coder.extrinsic を使用してそれらを外部関数として明示的に宣言する必要はありません。

coder.extrinsic(function1, ... ,functionN)function1 から functionN まで外部関数として宣言します。

coder.extrinsic('-sync:on', function1, ... ,functionN) は、外部関数 function1 から functionN までの呼び出しの前後で、MATLAB 実行と生成されたコードの実行または Simulink シミュレーションとの間のグローバル データの同期を有効にします。少数の外部呼び出しのみがグローバル データを使用または変更する場合、グローバル同期モードを At MEX-function entry and exit に設定してすべての外部関数呼び出しの前後で同期を無効にします。グローバル データを修正する外部呼び出しに対してのみ、'-sync:on' オプションを使用して同期を有効にします。

グローバル データのためのコード生成 (MATLAB Coder)を参照してください。

coder.extrinsic('-sync:off', function1, ... ,functionN) は、外部関数 function1 から functionN までの呼び出しの前後で、MATLAB 実行と生成されたコード実行との間のグローバル データの同期を無効にします。少数の外部呼び出しを除き、ほとんどの外部呼び出しでグローバル データを使用または修正する場合、グローバル データを修正しない外部呼び出しに対しては、'-sync:off' オプションを使用して同期を無効にします。

グローバル データのためのコード生成 (MATLAB Coder)を参照してください。

すべて折りたたむ

MATLAB 関数 patch はコード生成でサポートされていません。この例は、patch を外部 MATLAB 関数として宣言することにより、生成された MEX 関数で patch の機能を引き続き使用する方法を説明します。

この MATLAB コードは patch をローカル関数 create_plot の外部関数として宣言します。patch を外部関数として宣言することにより、patch のコード生成を行わないようコード ジェネレーターに指示します。代わりに、コード ジェネレーターは patch を実行のために MATLAB に送ります。

コード ジェネレーターでは、関数 axis など、多くの一般的な MATLAB 可視化関数が外部関数として自動的に処理されます。

function c = pythagoras(a,b,color) %#codegen
% Calculate the hypotenuse of a right triangle
% and display the triangle as a patch object. 
c = sqrt(a^2 + b^2);
create_plot(a, b, color);
end

function create_plot(a, b, color)
%Declare patch as extrinsic
coder.extrinsic('patch'); 
x = [0;a;a];
y = [0;0;b];
patch(x,y,color);
axis('equal');
end

pythagoras の MEX 関数を生成します。また、コード生成レポートを生成します。

codegen -report pythagoras -args {1, 1, [.3 .3 .3]}

レポートで、create_plot の MATLAB コードを表示します。

レポートでは、関数 patch と関数 axis が強調表示され、これらが外部関数として処理されることを示します。

MEX 関数を実行します。

pythagoras_mex(3, 4, [1.0 0.0 0.0]);

MATLAB に、直角三角形のプロットが赤い patch オブジェクトとして表示されます。

メモ

codegen コマンドを使用して MEX ファイルを生成する代わりに、関数 pythagoras を Simulink モデルの MATLAB Function ブロック内に配置するという方法もあります。モデルのシミュレーションを実行すると、MATLAB Function ブロックは pythagoras_mex と同様の動作をします。

グラフ用およびネットワーク アルゴリズム用の MATLAB 関数は、コード生成ではサポートされません。この例では、外部として宣言することで、生成された MEX コードでこれらの関数を引き続き使用可能にする方法を説明します。

有向グラフのソース ノードのインデックスとターゲット ノードのインデックスを入力として受け入れ、グラフが非循環であるかどうかを判定する MATLAB 関数 foo を定義します。関数 foo も有向グラフをプロットします。

関数 foo は、コード生成でサポートされない次の関数を呼び出します。

  • plot: コード ジェネレーターは、これらの関数を自動的に外部関数として取り扱います。

  • digraph および isdag: これら 2 つの関数は、coder.extrnisic 構造体を使用することで、明示的に外部関数として宣言されます。

function isDAG = foo(source,target)
coder.extrinsic('digraph','isdag');
assert(numel(source) == numel(target))
G = digraph(source,target);
plot(G)
isDAG = isdag(G);
end

foo の MEX コードを生成します。入力を double 型の非有界のベクトルであると指定します。

codegen foo -args {coder.typeof(0,Inf),coder.typeof(0,Inf)}

適切な入力を使用して、生成された MEX 関数 foo_mex を呼び出します。

foo_mex([1 2 4 4],[2 3 3 1])
ans =

  logical

   1

MATLAB は次のグラフも表示します。

A directed acyclic graph with four vertices and four edges.

入力引数

すべて折りたたむ

外部関数として宣言される MATLAB 関数の名前。

例: coder.extrinsic('patch')

データ型: char

制限

  • 外部関数呼び出しには、パフォーマンスに影響する可能性のある何らかのオーバーヘッドがあります。外部関数呼び出しで渡される入力データは MATLAB に指定しなければなりません。これにはデータのコピー作成が必要になります。関数に出力データが含まれている場合、このデータは MEX 関数環境に再転送しなければなりません。これにもコピーが必要になります。

  • コード ジェネレーターは、coder.extrinsic を使用したプライベート フォルダー内の関数の呼び出しをサポートしていません。

  • コード ジェネレーターは、coder.extrinsic を使用したローカル関数の呼び出しをサポートしていません。

ヒント

  • コード ジェネレーターでは、plotdispfigure など、多くの MATLAB 可視化関数が外部関数として自動的に処理されます。coder.extrinsic を使用してそれらを外部関数として明示的に宣言する必要はありません。

  • 外部関数として宣言しなければならない関数を検出するには、関数 coder.screener を使用します。この関数は、MATLAB コード内にコード生成でサポートされない機能や関数がないかどうかを調べるコード生成の準備状態ツールを実行します。

R2011a で導入