如何让Matlab保持mex会话存活

how to let Matlab keep a mex session alive

本文关键字:会话 mex 保持 Matlab      更新时间:2023-10-16

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

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

进一步的选择可能是在您的MEX函数中创建一个c++类实例,并将指向它的指针返回给MATLAB,将指针传递给任何后续调用。如果您使用这种方法,您还应该为它创建一个MATLAB句柄类包装器,以允许您在其析构函数中正确地清理内存。这里有一篇帖子,建议海报者这样做,这是Mathworks FileExchange方法的一个例子。

这个方法对你的问题的适用性取决于问题的复杂程度。我个人只会沿着这条路走下去,如果问题与其他方法是难以解决的复杂(例如,你需要使用某个库中的c++类,并且实例必须在调用之间保持活跃,或者如果全局变量不能做到这一点,因为你需要跟踪很多实例,这自然是最好的c++类数组,在那里你可以适当地分离你的关注)。

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

另一个选择是使用持久变量。从文档

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