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
インクルード ファイルを使用します。
この関数は、メンバー関数 display
と set_data
および変数 v1
と v2
をもつクラス myData
を定義します。クラス myData
のオブジェクト d
を作成し、v1
と v2
の初期化された値を表示します。次に、v1
と v2
を入力に設定し、新しい値を表示します。最後に、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 ファイルがクリアされる際にクリーンアップ作業 (データ ファイルを閉じる) を行います。この例では、ファイル操作 fopen
、fprintf
、および 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