2013-03-29 27 views
0

我的问题是如何编程Matlab和我的C++代码,以便它们可以交互。更具体地说,我有一个C++程序,用于处理数据,创建一个对象,导出该对象的统计信息并写入mat文件。然后我将在matlab中加载它来做进一步的分析和可视化。然而,处理数据和创建对象所花费的时间是巨大的,而导出统计数据的时间可以忽略不计。另一方面,有很多统计数据和它们的不同组合,很难预测我们将要使用什么样的组合。所以我希望我可以多次运行“统计”部分,而不必重复处理数据。如何让Matlab保持mex会话存活

我的问题是:我可以问Matlab:1.调用C++代码; 2.处理完数据并创建对象后,将该对象保留在内存中3.再次调用C++代码以请求将统计信息加载到我的工作空间中。 4.用不同的统计数据重复3。 谢谢

回答

1

完成此操作的一种方法是声明您想要在您的C++ mex code中再次访问的变量为global。这些变量将保留在内存中,并且您可以再次访问它们(当您调用mex函数时),直到您清除该mex函数或关闭Matlab会话。我为此使用了全局变量,它对我来说工作得很好。

另一种选择是使用persistent variables。从文档

持久变量与全局变量类似,因为MATLAB®软件为两者创建永久存储。它们与 全局变量不同,因为持久变量只有在声明它们的 函数中才是已知的。这可以防止其他函数或MATLAB 命令行更改变量的持久性 。

3

进一步的选择可能是在你的MEX函数中创建一个C++类实例,并返回一个指向它的指针,将指针传递给任何后续调用。如果你使用这种方法,你也应该为它创建一个MATLAB句柄类包装,以便让你在析构函数中正确地清理内存。 Here是一个帖子,其中海报被建议做到这一点,this是Mathworks FileExchange上的方法的一个例子。

此方法对您的问题的适用性取决于问题的复杂性。如果问题与其他方法难以解决复杂问题,我个人只会采用这种方式(例如,您需要从某个库中使用C++类,并且实例必须在调用之间保持活跃状态​​,或者如果全局变量不会执行此操作你需要跟踪很多实例,并且这很自然地由C++类的一个数组来表示,你可以正确地分离你的关注点)。

+0

+1不知道这种方法。 – Alexey