У меня есть экземпляр класса, и я хочу передать его функции, используя mexCallMATLAB
функция.
Класс изначально находится в Matlab, но так как данные находятся в моей оболочке C ++, я использовал это подход и упаковать мои данные к нему. Поэтому тип конечного объекта mwArray
(посмотрите упомянутую ссылку и GlobalData
класс, который находится в Matlab и globals
экземпляр, который находится в C ++). Но mexCallMATLAB
функция использует mxArray *
,
Как можно передавать данные mwArray *
в mwArray *
? Если типы были просты, это легко сделать с помощью ручной передачи. Например, создание двойного массива mxArray
и вручную скопировать данные в него. Но в этой ситуации данные являются классом нескольких полей / типов данных.
В более общем смысле, как передать класс функции Matlab из оболочки C ++?
Предположим, что это класс в Matlab
classdef GlobalData < handle
properties
val1
val2
val3
end
end
Это функция Matlab, которую я скомпилировал через mcc
и используется для упаковки класса.
function globals = create_globals()
globals = GlobalData();
globals.val1 = 2;
globals.val2 = 5.25;
globals.val3 = 'data name';
end
Это код C ++, который содержит данные. Здесь мы используем предыдущий метод для создания экземпляра GlobalData и передачи его функции Matlab myCallback
,
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
// ...
mwArray globals;
try {
// Pack data to a single Container class of type GlobalData
create_globals(1, globals);
} catch (const mwException& e) {
cerr << e.what() << endl;
return;
} catch (...) {
cerr << "Unexpected error thrown" << endl;
return;
}
int nlhs1 = 1, nrhs1 = 2;
mxArray *plhs1[1], *prhs1[2];
// First parameter of myCallback set to a arbitrary double value
prhs1[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
*mxGetPr(prhs1[0]) = .6;
// Here prhs1[1] must set to globals
// ??? prhs1[1] = globals ???
mexCallMATLAB(nlhs1, plhs1, nrhs1, prhs1, "myCallback");
// ...
}
Вы можете извлечь mxArray *
используя GetData()
метод.
mwArray *A;
mxArray *B;
B = A->GetData();
Других решений пока нет …