C указатели на переменные Matlab

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

повторный доступ к этой структуре данных с помощью движка Matlab занимает слишком много времени (~10-20 мс для каждого вызова engGetVariable и engPutVariable). Я думаю, это потому, что эти функции копируют данные в памяти.

таким образом, вместо использования engGetVariable в самой структуре данных, теперь Я пытаюсь получить указатель на структуру данных. Если я вызываю engGetVariable на указателе, я могу получить доступ к структуре данных в C, разыменовав указатель, без необходимости сначала копировать данные в память. Однако я не смог заставить это работать до сих пор. Возможно ли что-то подобное?

// Make vars in matlab workspace
engEvalString(ep, "a=9");
engEvalString(ep, "ap=getPointer(a)");

// Get variables in C
ap = engGetVariable(ep, "ap");
a = *mxGetPr(ap);

printf("a = %f", a);

1 ответов


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

в Windows API движка основан на COM интерфейсы, в то время как в системах UNIX движок основан на труб (она даже может работать против удаленных машин с помощью rsh).

таким образом, единственный вариант, который у вас есть, - использовать открытые функции engGetVariable и engPutVariable для обмена данными: вы получаете копию переменной из рабочей области MATLAB, используя engGetVariable, вы получаете базовый mxArray указатель данных с mxGetData и манипулировать массивом, как вы хотите, а затем отправить обновленную копию обратно в MATLAB с помощью engPutVariable.