Как можно передавать данные между & quot; mwArray * & quot; и & quot; mxArray * & quot ;?

У меня есть экземпляр класса, и я хочу передать его функции, используя 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");
// ...
}

0

Решение

Вы можете извлечь mxArray * используя GetData() метод.

   mwArray *A;
mxArray *B;

B = A->GetData();
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]