6

我正在开发一个需要重复访问大型 Matlab 数据结构的 C 程序。这是一个使用 OpenGL 的图形密集型程序,因此它必须很快。

使用 Matlab 引擎重复访问此数据结构似乎需要很长时间(每次调用 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);
4

1 回答 1

3

MATLAB 引擎作为独立于您的程序的进程在后台运行,并拥有自己的地址空间。因此,指向另一个进程内存中数据的指针是不可能的,唯一的选择是使用某种IPC机制进行通信。

在 Windows 上,引擎 API 基于COM接口,而在 UNIX 系统上,引擎基于管道(它甚至可以在rsh.

因此,您唯一的选择是使用公开的函数engGetVariableengPutVariable交换数据:您从 MATLAB 工作区获取变量的副本,使用engGetVariable获取底层mxArray数据指针mxGetData并根据需要操作数组,然后发送更新的使用 . 复制回 MATLAB engPutVariable

于 2014-10-09T23:18:52.360 回答