MATLABでC言語 (C language with MATLAB)
MATLABで脳波分析プログラムを書いているのですが、どうしてもできないことがあったのです。
それは、「現在、特定のキーが押されているかどうか」を検出すること。
長時間かかる処理を特定のキーを押して中断させたい場合があります。これには、上記の処理が必要なのですが、MATLABにはこれを行う関数が見当たりません。
見えないFigureを使うという技があるのですが、ちょっとスマートじゃない。
なので、この処理を行う関数を作ることにしました。
この処理を行うには、GetAsyncKeyStateというWindows APIを使います。これをMATLABから呼び出すために、C言語でプログラムすることにしました。C言語は、Palmwareを作っていた頃以降は使っていないので、ちょっと不安でしたが...
MATLABには、MATLAB用にC言語で作ったファイルをコンパイルするためのmex関数があります。これを使って、GetAsyncKeyState.cというファイルを作りました。
#include "mex.h"
#include <windows.h>
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
int c;
bool hit;
if (nrhs != 1) {
mexErrMsgTxt("GetAsyncKeyState: Only 1 input variable is accepted.");
} else if (nlhs > 1) {
mexErrMsgTxt("GetAsyncKeyState: Too many output variables.");
}
if (!mxIsChar(prhs[0])) {
mexErrMsgTxt("GetAsyncKeyState: Input variable must be Char.");
}
c = mxGetScalar(prhs[0]);
if (HIBYTE(GetAsyncKeyState(c))) {
hit = true;
} else {
hit = false;
}
plhs[0] = mxCreateLogicalScalar(hit);
}
ちょっと冗長な書き方の部分がありますが、まぁよしということで。
あとは、mex GetAsyncKeyState.cでコンパイルを行うと、GetAsyncKeyState関数が使用可能になります。
使用法ですが、この関数に検出したい文字1文字を渡して呼び出すと、その時点でそのキーが押されていたかどうかを論理値で返してくれます。
例えば、エスケープキーでループを脱出したいときは、MATLABで以下のとおり。
if GetAsyncKeyState(char(27))
break;
end
これでだいぶ便利になりました♪
| 固定リンク
コメント