C 指向 Matlab 变量的指针

标签 c matlab matlab-engine

我正在编写一个需要重复访问大型 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);

最佳答案

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

在 Windows 上,引擎 API 基于 COM接口(interface),而在 UNIX 系统上,引擎基于 pipes (它甚至可以在 rsh 的帮助下针对远程机器运行)。

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

关于C 指向 Matlab 变量的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26286281/

相关文章:

c++ - 问题包括 MATLAB "engine.h"for C++ code

python - Matlab Engine Python - OSx Anaconda Segfault 或 iPython 的 DYLD_LIBRARY_PATH 错误

c++ - 如何用C连续输出计算开始后的秒数?

arrays - 在 Matlab 中增长 3D 数组

c - C C++ 中的 matlab 和 matlab 中的 C C++

matlab - 相机标定 MATLAB 工具箱

matlab - Matlab 中的文本和绘图到 LaTeX

c - 这个 void 函数不起作用 ;(

c - 为什么这个链表代码总是导致 head 为空?

c - 为什么我的 C 程序显示的 int 与应有的不同