【问题标题】:C pointers to Matlab variables指向 Matlab 变量的 C 指针
【发布时间】:2014-12-04 20:20:41
【问题描述】:

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

【问题讨论】:

  • ap 变量有什么用?为什么不直接获取与a 相对应的mxArray,然后根据需要多次调用mxGetPr
  • 你看到的输出是什么?
  • a 数据结构可以在引擎访问它的时间之间在 Matlab 中进行修改。当a 被修改时,它似乎被复制到了不同的内存位置,所以mxGetPr 并不指向更新后的副本。
  • 当前输出的数字不是a中存储的数字,例如a = -128778304.000000
  • printf("a = %lf", a); 打印什么?

标签: c matlab matlab-engine


【解决方案1】:

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

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

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

【讨论】:

  • 将 MATLAB 引擎视为客户端/服务器模型的抽象;您当然不能直接访问服务器上的远程对象的数据,您只能通过客户端公开的接口和 API 来访问。
猜你喜欢
  • 2019-09-10
  • 2020-04-13
  • 2010-11-11
  • 1970-01-01
  • 2011-08-04
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
相关资源
最近更新 更多