Main Content

C 行列 API を使用した C++ MEX 関数の作成

メモ

MATLAB® には、最新の C++ セマンティクスと設計パターンであるC++ 用の MATLAB データ APIを使用する API が備わっています。MathWorks では、この API を使って MEX 関数を作成するよう推奨しています。詳細については、MATLAB (MEX ファイル) から呼び出せる C++ 関数の記述を参照してください。

MEX 関数が R2017b 以前の MATLAB で実行されなければならない場合は、C++ アプリケーションで C 行列 APIを使用しなければなりません。C 行列 API を使ってビルドされた MEX 関数は、すべての C++ 言語標準をサポートします。このトピックでは、MEX ファイルの作成と使用に際して検討すべき C++ 言語固有の問題について説明します。

MATLAB C コードの例を C++ アプリケーションで使用することができます。たとえば、C および C++ 両方のステートメントを含む、C++ クラスの例mexcpp.cpp を参照してください。

C++ ソース ファイルの作成

MATLAB C++ のソース コード例は、.cpp ファイル拡張子を使用します。拡張子 .cpp は一義的で、C++ コンパイラで認識されます。その他の拡張子として、.C.cc および .cxx があります。

コンパイルとリンク

C++ MEX ファイルをビルドするには、以下を入力します。

mex filename.cpp

ここで filename は、MATLAB パス上にあるソース コード ファイルの名前です。

C++ MEX ファイルは、ファイルをコンパイルしたものと同じバージョンの MATLAB システムでのみ実行できます。

クラス デストラクターでのメモリに関する留意点

MEX 関数で使用されるクラスの C++ デストラクターで関数 mxFree または関数 mxDestroyArray を使用しないでください。MEX 関数がエラーをスローすると、MEX ファイルでの一時配列の自動クリーンアップで説明されているように、MATLAB は MEX ファイル変数をクリーンアップします。

オブジェクトがスコープ外になるエラーが発生すると、MATLAB により C++ デストラクターが呼び出されます。デストラクターでメモリを直接解放することは、MATLAB とデストラクターの両方で同じメモリを解放することを意味し、メモリを破損する可能性があります。

mexPrintf を使用した MATLAB コマンド ウィンドウへの表示

cout や C 言語の関数 printf を使用しても、C++ MEX ファイルでは期待どおりに機能しません。代わりに関数 mexPrintf を使用します。

C++ クラスの例

MEX ファイル mexcpp.cpp は、C++ コードを C 言語の MEX ファイルで使用する方法を示します。この例では、C 行列 API の関数を使用します。この例ではメンバー関数、コンストラクター、デストラクター および iostream インクルード ファイルを使用します。

この関数は、メンバー関数 displayset_data および変数 v1v2 をもつクラス myData を定義します。クラス myData のオブジェクト d を作成し、v1v2 の初期化された値を表示します。次に、v1v2 を入力に設定し、新しい値を表示します。最後に、delete 演算子がオブジェクトのクリーンアップを行います。

この例をビルドするには、ファイルを MATLAB パスにコピーし、コマンド プロンプトで次のように入力します。

mex mexcpp.cpp

呼び出し構文は、mexcpp(num1, num2) です。

C++ ファイル処理の例

mexatexit.cpp の例で、C++ でのファイルの処理機能について説明します。関数 mexAtExit を使用する C コードの例 mexatexit.c と比較してください。

C++ の例

C++ の例では、fileresource クラスを使用して、ファイルを開くまたは閉じる関数を処理します。MEX 関数はこのクラスの (データ ファイルを閉じる) デストラクターを呼び出します。またこの例は、データ ファイルの操作時に画面にメッセージを表示します。ただしこの例では、実行される C ファイルの操作は書き込み操作 fprintf のみです。

mexatexit.cpp MEX ファイルをビルドするには、ファイルを MATLAB パスにコピーして、次のように入力します。

mex mexatexit.cpp

以下を入力します。

z = 'for the C++ MEX-file';
mexatexit(x)
mexatexit(z)
clear mexatexit
Writing data to file.
Writing data to file.

matlab.data の内容を表示します。

type matlab.data
my input string
for the C++ MEX-file

C の例

C コードの例では、関数 mexAtExit を登録し、MEX ファイルがクリアされる際にクリーンアップ作業 (データ ファイルを閉じる) を行います。この例では、ファイル操作 fopenfprintf、および fclose を実行するときに、mexPrintf を使用して画面にメッセージを出力します。

mexatexit.c MEX ファイルをビルドするには、ファイルを MATLAB パスにコピーして、次のように入力します。

mex mexatexit.c

例を実行します。

x = 'my input string';
mexatexit(x)
Opening file matlab.data.
Writing data to file.

MEX ファイルをクリアします。

clear mexatexit
Closing file matlab.data.

matlab.data の内容を表示します。

type matlab.data
my input string

参考

|

関連する例

詳細