2014-10-09 103 views
6

我的工作,需要反复地访问大量数据Matlab的结构的C程序。这是一个使用OpenGL的图形密集型程序,因此它必须快速。C指针Matlab的变量

多次访问与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); 
+0

什么好处了'ap'变量在做什么?为什么不只是获得对应于'a'的'mxArray',并根据需要多次调用'mxGetPr'? – 2014-10-09 19:48:28

+0

你看到的输出是什么? – AnonSubmitter85 2014-10-09 20:05:46

+0

'a'数据结构可以在Matlab中在引擎访问它的时间之间修改。当'a'被修改时,它似乎被复制到不同的存储位置,所以'mxGetPr'不指向更新的副本。 – 2014-10-09 20:11:54

回答

3

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

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

所以你唯一的选择是使用公开的函数engGetVariableengPutVariable交换数据:您可以使用engGetVariable获得从MATLAB工作空间中的变量的副本,你得到的与mxGetData底层mxArray数据指针和处理数组如你所愿,然后你使用engPutVariable将更新的副本发送回MATLAB。

+1

将MATLAB引擎视为客户机/服务器模型的抽象;你当然不能直接访问服务器上的远程对象的数据,你只能通过客户端暴露的接口和API来实现。 – Amro 2014-10-09 23:28:26