MatLabからCのコードを読み込む

MEX(Matlab EXecutable)を使えば出来る.
C/C++のコードをmexでコンパイルするとダイナミックリンクしたサブルーチンが生成されて,mファイルやビルトイン関数のように使える.
C/C++の既存のコードを書きなおす必要がないし,matlabでは処理が遅いfor-loop系の処理をCで行える利点がある.

シンプルなコードを作って見た.scaling関数(二つの入力の積を計算する)で試す.

#include “mex.h”

double scaling(double d1, double d2)
{
return d1 * d2;
}

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
double d1, d2, *res;

d1 = mxGetScalar(prhs[0]);
d2 = mxGetScalar(prhs[1]);
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);

res = mxGetPr(plhs[0]);
res[0] = scaling(d1, d2);
}

まずmex.hというヘッダファイルをインクルード.
MEXのソースコードは計算ルーチンとゲートウェイルーチンの二つから成り立つ.
計算ルーチンは,実際の処理の計算を実行するコード(上記のscaling関数).
ゲートウェイルーチンは計算ルーチンとMATLABのインタフェース(上記mexFunction関数).

mexFunctionは4つの引数(prhs,nrhs,plhs,nlhs)を持ち,計算ルーチンに対してMATLABから渡された変数や行列を渡す.
prhsは右辺入力引数の配列,nrhsは右辺入力引数の数,plhsは左辺出力引数の配列,nlhsは左辺出力引数の数を表す.
mxGetScalar(prhs[n])で,n番目の右辺入力引数の値を取得できる.
以下の2行で,左辺出力の1番目の引数に1×1の行列を指定して,resをそのポインタにしている.
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
res = mxGetPr(plhs[0]);
最後の1行で計算ルーチンの結果を左辺出力の1番目の引数に格納してる.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s