通过Mex文件与C ++对象交互

时间:2017-10-25 18:04:04

标签: c++ matlab mex

如果我目前的目标可行,我会有点坚持,如果是的话,如何做到这一点。我希望通过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*/);
     }
}

以下是我的问题:

  1. 如何在调用不同的 Mex文件时保持此std :: vector的持久性?没有办法从Mex文件中返回非Matlab类型(我知道),并且Mathworks说Mex函数中的局部变量通常在函数返回时被垃圾收集,这是我不想要的。如何在不同的函数中调用与我感兴趣的存储对象相同的std :: vector?甚至调用相同的功能?

  2. 使用Matlab有更好的方法吗?基本上我正在尝试使用Matlab来驱动一些C ++代码,这些代码完成了繁重的工作,然后将它全部带回Matlab进行分析。麻烦的是已经编写了C ++代码,我需要尝试修改Matlab以适应这些类。

1 个答案:

答案 0 :(得分:2)

不确定Mex函数之间是否可行,但您可以在调用同一个mex例程之间保持一些持久性。

请参阅以下文档:

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

我自己没有这样做,所以不能提供更具体的帮助,但这可能会指向正确的方向。