I am Charmie

メモとログ

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番目の引数に1x1の行列を指定して,resをそのポインタにしている.
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
res = mxGetPr(plhs[0]);
最後の1行で計算ルーチンの結果を左辺出力の1番目の引数に格納してる.