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

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

Перед Версией 8.4 файлы MEX использовали библиотечные функции Ссылки API C/C++ и Фортрана 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, рассмотрите один или несколько следующих действий.

Замените 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] \in 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)

Смотрите также

|

Похожие темы