如果我当前的目标可行,那么我会有些犹豫,如果可行,该如何做。我希望通过Mex文件与某些C++类进行交互,但是我需要访问的对象的实例在不同Mex函数的调用之间保持持久性。例如,假设我在初始化Mex文件中执行以下操作:

void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    size_t nCats = (size_t) *mxGetPr(prhs[0]);

    std::vector<Cat> cats;
    for(size_t i = 0; i <nCats; i++){
         cats[i] = Cat(/* arguments to constructor*/);
    }
}

因此,我已经从外部C++代码初始化了Cat对象。现在,稍后,我需要更新有关Cat对象的信息,因此在另一个Mex文件中,
void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{

     for(size_t i = 0; i < nCats; i++){
          cats[i].feed(/*parameters to feed method*/);
     }
}

这是我的问题:
  • 我如何使此std::vector在对不同Mex文件的调用之间持续存在?没有一种方法可以从Mex文件中返回非Matlab类型(据我所知),Mathworks说,当函数返回时,Mex函数中的局部变量通常会被垃圾回收,这是我所不希望的。如何在不同的函数中使用对我感兴趣的存储对象调用相同的std::vector?甚至调用相同的函数?
  • 是否有更好的方法可以用Matlab做到这一点?本质上,我试图使用Matlab来驱动一些C++代码,这会很繁重,然后将其全部带回Matlab进行分析。麻烦在于,C++代码已经编写好了,我需要尝试弯曲Matlab使其适合那些类。
  • 最佳答案

    不确定在Mex函数之间是否可能,但是您可以使某些事情在同一mex例程的调用之间保持不变。

    请参阅说明文件:

  • mexMakeMemoryPersistent
  • mexMakeArrayPersistent

  • 另请参见Mathworks网站上的以下答案:
    How can I make memory persistent between calls to a MEX-file in MATLAB

    我自己没有做过此事,因此无法提供更多具体的帮助,但这可能会为您指明正确的方向。

    关于c++ - 通过Mex文件与C++对象进行交互,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46939226/

    10-12 19:19