exponenta event banner

Обновление файлов MEX для использования графических объектов

MATLAB ® версии 8.4 (R2014b) изменяет тип данных дескрипторов на графические объекты изdouble в объект.

До версии 8.4 файлы MEX использовали функции справочной библиотеки C/C + + и Fortran APImexGet и mexSet, которые объявляют аргумент входного дескриптора как тип double. Если используется функция MEX mexGet или mexSetMATLAB отображает следующую ошибку.

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, рассмотрите одно или несколько из следующих действий.

Заменить 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 выводит сообщение об ошибке.

Чтобы изменить исходный файл, внесите следующие изменения. Этот код использует переменную plhs[0] в mxGetProperty чтобы получить 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 использует этот шаблон, если функция выполняется без ошибок.

При перестроении этого MEX-файла в MATLAB R2014b или более поздней версии MATLAB выводит сообщение об ошибке. Чтобы перестроить файл, следуйте инструкциям в разделе «Заменить функции mexGet и mexSet» или «Я хочу перестроить файлы исходного кода MEX».

Я хочу перестроить файлы исходного кода MEX

При перестроении исходных файлов MEX в MATLAB R2014b или более поздней версии MATLAB выводит сообщение об ошибке.

Возможно, вы сможете использовать mex флаг совместимости команд, -DMEX_DOUBLE_HANDLE, для построения файла MEX для работы с графическими объектами. Если функция MEX вызывает функцию, которая возвращает графический дескриптор с помощью mexCallMATLAB или mexGetVariable MATLAB автоматически обнаруживает и преобразует тип дескриптора. Чтобы построить исходный файл, mymex.c, введите:

mex -DMEX_DOUBLE_HANDLE mymex.c

При передаче графического дескриптора функции MEX преобразуйте маркер в double перед вызовом функции. Дополнительные сведения см. в разделе У меня нет файла исходного кода MEX.

У меня нет файла исходного кода MEX

При возникновении ошибки во время выполнения и отсутствии исходного кода можно воспользоваться следующим обходным путем. Это обходное решение используется только для функций MEX, которые используют графический дескриптор в качестве входного аргумента.

Перед передачей графического дескриптора функции MEX сначала преобразуйте маркер в двойной. Например, при вызове функции MEX mymex:

Y = 1:10;
h = plot(Y); 
mymex(h)

затем добавить оператор для преобразования дескриптора h для удвоения:

Y = 1:10;
h = plot(Y);
h = double(h);
mymex(h)

См. также

|

Связанные темы