如何避免重复初始化.mex (matlab编译代码)

How to avoid duplicate initialization of .mex (matlab compiled code)?

本文关键字:matlab 编译 代码 mex 何避免 初始化      更新时间:2023-10-16

我有Matlab代码,调用从c++代码生成的MEX。c++代码在初始化时需要大量的内存分配和计算。使用静态指针,只在第一次调用时进行初始化,在后续调用时读取指针。

一切都工作得很好,直到这个Matlab代码使用Matlab编译器编译。现在对MEX的后续调用(现在发生在matlab编译的代码中)最终会崩溃,因为静态指针显然引用了无效的内存。

在这种情况下,如何避免重复初始化?

谢谢,狮子座

问得好。您可能必须将其分解为两个不同的mex函数,一个计算初始化并返回其结果,另一个执行您的函数。

  [heavyCompResults,otherHeavyResults] = initComputation(initParams);

:

  performComputation(compParams,heavyCompResults,otherHeavyResults);

或者,您可以将内容写在文件中,而不是通过Matlab传递。

  initComputation(initParams,initResultsFname);  %writes initResultsFname

:

  performComputation(compParams,initResultsFname); %reads initResultsFname

另一个选项:

将您的代码转换为DLL并在Matlab中使用loadLibrary函数。这样,当您创建静态时,它应该在调用之间保留在内存中。但我还没有验证过。

我不确定你是否已经解决了你的问题,但是这里有一些相关的信息对我有帮助。

这似乎与我遇到的问题相似。在编译同一函数的新版本时(其中一个有内存访问问题),我发现旧版本的mex函数实际上并没有离开内存。我尝试了很多事情,包括(据说)使用clear mex-file-name从matlab内存中清除mex函数。唯一成功的方法来防止重复访问相同的有缺陷的mex函数我发现是重新启动matlab。这每次都修复了内存问题。虽然这种情况和解决方案不完全匹配您的问题,我的建议是尝试重新启动matlab。