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
.