Eri*_*ler 6 c matlab matlab-engine
我正在研究一个需要重复访问大型Matlab数据结构的C程序.这是一个使用OpenGL的图形密集型程序,因此必须快速.
使用Matlab Engine重复访问此数据结构似乎花费的时间太长(每次调用engGetVariable和engPutVariable约10-20毫秒).我认为这是因为这些函数将数据复制到内存中.
因此,不是在数据结构本身上使用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);
Run Code Online (Sandbox Code Playgroud)
MATLAB 引擎作为独立于程序的进程在后台运行,并拥有自己的地址空间。因此,指向另一个进程内存中的数据的指针是不可能的,唯一的选择是使用某种IPC机制进行通信。
在 Windows 上,引擎 API 基于COM接口,而在 UNIX 系统上,引擎基于管道(它甚至可以在 的帮助下针对远程计算机运行rsh
)。
因此,您唯一的选择是使用公开的函数engGetVariable
并engPutVariable
交换数据:您使用 来从 MATLAB 工作区获取变量的副本engGetVariable
,使用 获取底层mxArray
数据指针并mxGetData
根据需要操作数组,然后发送更新后的数据。使用 复制回 MATLAB engPutVariable
。