Main Content

グラフィックス オブジェクトを使用するための 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)

参考

|

関連するトピック