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.cBuilding 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 в 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 mymex:
Y = 1:10; h = plot(Y); mymex(h)
затем добавить оператор для преобразования дескриптора h для удвоения:
Y = 1:10; h = plot(Y); h = double(h); mymex(h)