グラフィックス オブジェクトを使用するための MEX ファイルのアップグレード
MATLAB® Version 8.4 (R2014b) では、グラフィックス オブジェクトのハンドルのデータ型が double
から "オブジェクト" に変わります。
Version 8.4 以前は、MEX ファイルは C/C++ および Fortran API リファレンスのライブラリ関数 mexGet
および mexSet
を使用していました。これらの関数は、double
型としてハンドルの入力引数を宣言します。MEX 関数が mexGet
または mexSet
を使用する場合、MATLAB は、次のエラーを表示します。
Error using mex Deprecated MEX function mexGet|mexSet was called. Either update the source code to use mxGetProperty|mxSetProperty, OR rerun MEX with the -DMEX_DOUBLE_HANDLE added to the command line to enter compatibility mode.
MEX ファイルをアップグレードするには、次のアクションを 1 つ以上検討してください。
関数 mexGet
および関数 mexSet
の置換
MEX ファイルをアップグレードしてグラフィックス オブジェクトを使用するには、mexGet
の呼び出しを mxGetProperty
に、mexSet
の呼び出しを mxSetProperty
に置き換えます。次のプログラム コードは、ソース MEX ファイルの前後の例を示します。
次のコードは、mexCallMATLAB
を使用してプロットを作成し、変数 plhs[0]
でそのグラフィックス ハンドルを返します。ラインの色を変更するために、例では mxGetScalar
を使用してそのハンドルを double
に変換してから mexGet
および mexSet
に渡します。
#include "mex.h" #define RED 0 #define GREEN 1 #define BLUE 2 void fill_array(double *x) { int i = 0; for(i = 0 ; i < 4 ; i++) { x[i] = i+1; } } void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { mxArray *color; int ret; double handle; mxArray *copycolor; double *acolor; mxArray *data = mxCreateDoubleMatrix(1,4,mxREAL); fill_array(mxGetPr(data)); ret = mexCallMATLAB(1,&plhs[0],1,&data,"plot"); if(!ret) { handle = mxGetScalar(plhs[0]); color = mexGet(handle,"Color"); copycolor = mxDuplicateArray(color); acolor = mxGetPr(copycolor); acolor[RED] = (1 + acolor[RED]) /2; acolor[GREEN] = acolor[GREEN]/2; acolor[BLUE] = acolor[BLUE]/2; mexSet(handle,"Color",copycolor); mxSetProperty(plhs[0],0,"Color",copycolor); } }
この MEX ファイルをビルドすると、MATLAB はエラー メッセージを表示します。
ソース ファイルを変更するには、次の編集を行います。このコードは、mxGetProperty
で変数 plhs[0]
を使用し、直接 Color
プロパティを取得します。中間変数 handle
を作成する必要はありません。
#include "mex.h"
#define RED 0
#define GREEN 1
#define BLUE 2
void fill_array(double *x)
{
int i = 0;
for(i = 0 ; i < 4 ; i++)
{
x[i] = i+1;
}
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
mxArray *color;
int ret;
mxArray *copycolor;
double *acolor;
mxArray *data = mxCreateDoubleMatrix(1,4,mxREAL);
fill_array(mxGetPr(data));
ret = mexCallMATLAB(1,&plhs[0],1,&data,"plot");
if(!ret)
{
color = mxGetProperty(plhs[0],0,"Color");
copycolor = mxDuplicateArray(color);
acolor = mxGetPr(copycolor);
acolor[RED] = (1 + acolor[RED]) /2;
acolor[GREEN] = acolor[GREEN]/2;
acolor[BLUE] = acolor[BLUE]/2;
mxSetProperty(plhs[0],0,"Color",copycolor);
}
}
この MEX ファイルをビルドするには、以下を入力します。
mex mymex.c
Building with 'Microsoft Visual C++ 2012 (C)'. MEX completed successfully.
または、MEX ソース コード ファイルのリビルド方法の手順に従って元のソース ファイルをビルドすることができます。
mex
によるハンドル型の自動変換
MEX 関数が関数 mexCallMATLAB
または mexGetVariable
を使用してグラフィックス ハンドルを取得し、そのハンドルを mexGet
および mexSet
API に渡す場合、MATLAB は自動的にその動作を検出し、MEX 関数はそのまま適切に実行されます。関数がエラーなしで実行される場合は、MEX 関数がこのパターンを使用していることがわかります。
MATLAB R2014b 以降でこの MEX ファイルをリビルドする場合、MATLAB はエラー メッセージを表示します。ファイルをリビルドするには、関数 mexGet および関数 mexSet の置換またはMEX ソース コード ファイルのリビルド方法のいずれかの説明に従ってください。
MEX ソース コード ファイルのリビルド方法
MATLAB R2014b 以降で MEX ソース ファイルをリビルドする場合、MATLAB はエラー メッセージを表示します。
mex
コマンドの互換性フラグ -DMEX_DOUBLE_HANDLE
を使用して、グラフィックス オブジェクトを扱う MEX ファイルをビルドできる場合があります。MEX 関数が、関数 mexCallMATLAB
または関数 mexGetVariable
を使用してグラフィックス ハンドルを返す関数を呼び出す場合、MATLAB はハンドル型を自動的に検出して変換します。ソース ファイル mymex.c
をビルドするには、以下を入力します。
mex -DMEX_DOUBLE_HANDLE mymex.c
グラフィックス ハンドルを MEX 関数に渡した場合、そのハンドルは関数を呼び出す前に double
に変換されます。詳細については、MEX ソース コード ファイルがない場合を参照してください。
MEX ソース コード ファイルがない場合
ランタイム エラーが発生し、ソース コードがない場合、次の回避策を適用できることがあります。この回避策は、グラフィックス ハンドルを入力引数として取る MEX 関数のみに使用してください。
グラフィックス ハンドルを MEX 関数に渡すには、まずそのハンドルを double に変換します。たとえば、MEX 関数 mymex
を呼び出す場合は、次のようにします。
Y = 1:10; h = plot(Y); mymex(h)
次に、ステートメントを追加してハンドル h
を double に変換します。
Y = 1:10; h = plot(Y); h = double(h); mymex(h)