倍精度の入力ベクトルを取り、精度を一時的な単精度ベクトルにダウンキャストし、処理を行ってから、処理の結果を再び倍精度にアップキャストする mex 関数があります。
次の簡略化されたコード例は、このプロセスをコンパイルして示しています。
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
int xM = mxGetM(prhs[0]);
int xN = mxGetN(prhs[0]);
int totalNumElements = xM*xN;
plhs[0] = mxCreateDoubleMatrix(xM,xN,mxREAL);
double* out = mxGetPr(plhs[0]);
double* in = mxGetPr(prhs[0]);
float out32[totalNumElements];
float in32[totalNumElements];
// ---------> DOWNCAST <---------
for (int mm = 0; mm < totalNumElements; ++mm)
in32[mm] = (float)in[mm];
// ---------- DOWNCAST ----------
// Do some single precision signal processing (just copy for this example)
for (int mm = 0; mm < totalNumElements; ++mm)
out32[mm] = in32[mm];
// ---------> UPCAST <---------
for (int mm = 0; mm < totalNumElements; ++mm)
out[mm] = (double)out32[mm];
// ---------- UPCAST ----------
}
私のマシンでは、このようにコンパイルされた mex 関数を呼び出すとうまくいきます。.
>> x = randn(1e6,1); y=demo(x);
...しかし、このように呼び出すと、Matlab が予期せず終了します
>> x = randn(1e7,1); y=demo(x);
クラッシュが入力ベクトルのサイズの増加によって引き起こされているのを見て、エラーはメモリ割り当ての失敗が原因であると推測しています。このようなエラーが発生した場合、Matlab を正常に終了してエラー メッセージを表示するにはどうすればよいですか? ありがとう。