MATLABでC関数ライブラリを呼び出すことは可能ですが、最初に環境とコンパイラを構成し、CとMATLABを接続するためのインターフェイス関数を作成する必要があります。
このmex関数の機能は、既製のC関数ライブラリを簡単に呼び出すこと、または非効率でエネルギーを消費する部門のMATLABコードをCの代替に書き直すことです。
- Cコンパイラをインストールする
MATLAB自体はC言語をコンパイルできず、他のコンパイラのサポートが必要です。
ここで使用されるMinGW-w64、注:MATLABバージョンはMinGW-w64バージョンに対応する必要があります。MATLABコミュニティでの紹介:
https://ww2.mathworks.cn/matlabcentral/fileexchange/52848-matlab-support-for-mingw-w64-cc-compiler
オンラインインストールツールは非常にゴミで、ダウンロードできず、はしごを掛けることもできません。オフラインパッケージと一緒にインストールすることもできます。目的のパスである6.3バージョンのオフラインパッケージリンクに解凍するだけです。
環境変数の構成:(パスは、独自のファイルパスに従って変更する必要があります)
MinGWをMATLABにインストールします。
Matlabコマンドラインでsetenv( 'MW_MINGW64_LOC'、folder)を実行します。フォルダーはMinGWのインストール場所(環境変数パスと同じ)であり、一重引用符が必要です。
MinGWが正常にインストールされているかどうかを確認します。
Matlabコマンドラインでmex-setupを実行すると、以下が成功します。
- インターフェイスファイルの書き込み、コンパイル、呼び出し
インターフェイスファイル要素:
インターフェイスファイルは、C環境とMATLAB環境を関連付けるために使用されるファイルです。ファイルタイプは.cです。ファイルの最もチェックされているテンプレートは次のとおりです。
#include "mex.h"
void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
{
return;
}
関数名mexFunction とそのパラメーターは固定されており、変更できません。インターフェース変換はこの関数で行われ、必要なC関数が呼び出されて関数が完成します。
ファイルのコンパイル:
パスにコンパイルする必要のあるCファイルが複数ある場合は、次のコンパイルコマンドを使用します。
mex -output mex_compress * .c %すべてのCファイルをコンパイルして、mex_compressバイナリファイルを生成します
インターフェイス関数呼び出し:
ファイル内のmexFunction関数のみをMATLABで呼び出すことができ、その後、他の関数関数をこの関数で呼び出すことができます。ただし、特別な注意が必要です。MATLABでこの関数を呼び出す場合、関数名はmexFunctionではなく、ファイル名です。たとえば、ファイルの名前がhello.cの場合、呼び出し元のコマンドは[c、d] = hello(a、b);です。
詳細については、公式WebサイトのAPIの説明を参照してください。
API:https://ww2.mathworks.cn/help/matlab/cc-mx-matrix-library.html?s_tid = CRUX_lftnav
- インターフェイスパラメータの転送
パラメータの概念:
インターフェイスのパラメータは、Cと同じように両方向(ポインタモード)に渡すことができます。インターフェイスには4つの正式なパラメータがあります。
int nlhs、mxArray * plhs []、int nrhs、const mxArray * prhs []
このパラメータを理解するのは少し難しいので、概念は段階的に明確です
最初に着信レベルを呼び出します。MATLABがインターフェイスを呼び出すとき、入力パラメーターはこれらの4つの正式なパラメーターに1つずつマップされません。
パラメータ定義:nlhs出力パラメータ番号、plhs []出力パラメータ値、nrhs入力パラメータ番号、prhs []入力パラメータ
(Lは左出力、Rは右入力を意味します)
パラメータ形式:パラメータ値plhs []およびprhs []は実際にはアドレスであり、アドレスは複数のパラメータをサポートし、各パラメータは多次元マトリックスを含む任意の形式にすることができるため、インターフェイスの実際のパラメータは次のようになります。数はほぼ無限に拡張できます。
パラメータ入力:
パラメータは2つのインターフェイスを介して入力され、nrhsは値=パラメータの総数を入力し、plhs []はポインタを入力し、最初のパラメータはplhs [0]、2番目のパラメータはplhs [1]です。各パラメーターは、マトリックスを含む任意のタイプにすることができます。nrhs = 2の場合、plhs [0]とplhs [1]にはデータがあり、plhs [2]にはデータがないことを意味します。パラメータデータの取得方法は以下のとおりです。
unsigned char * idata;
idata = mxGetPr(prhs [0]); //行列へのポインタを取得します
mexPrintf(" idata [0] =%d \ n" 、idata [0] );
パラメータ出力:
関数でデータを送信する方法は入力と同様です。plhs[]は送信パラメーターのアドレスですが、nlhsを操作する必要はありません。データ転送方法は次のとおりです。
まず、plhs [0]アドレスにデータタイプを作成します(uint32タイプはここで作成されます。詳細については、公式Webサイトを参照してください)。
plhs [0] = mxCreateUninitNumericMatrix(1、1、mxUINT32_CLASS、mxREAL);
次に、mxGetPrを介してplhs [0]のポインターを取得します。
unsigned long * out_ ptr = mxGetPr(plhs [0]);
次に、パラメータplhs [0]のポインタout_ptrをC関数に接続します
My_C_function(out_ ptr);
MATLABファイルのmexFunction関数からデータを取得します。
[ c、d ] = mex_ helloworld (a、b );
cとdは、plhs [0]とplhs [1]に対応する2つの発信パラメーターです。
mexFunction関数について:
この関数は、MATLABとCの間のインターフェースにのみ使用されます。インターフェース変換や検査などの関数は、関数に実装されます。この関数にCの関数実現プログラムを記述する必要はありません。正しい方法は、この関数で純粋なC関数を呼び出すことです。たとえば、この関数はprintf関数をサポートしていません。代わりに、MATLABのmex関数のmexPrintf関数が使用されます。関数で呼び出されるC関数は、完全なC関数をサポートします。