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

Interacting with C++ objects through Mex files

如果我当前的目标可行,我有点犹豫不决,如果可行,如何实现。我希望通过 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. 如何使这个 std::vector 在调用 不同的 Mex 文件时保持不变?没有办法从 Mex 文件中 return 非 Matlab 类型(我知道),Mathworks 说 Mex 函数中的局部变量通常在函数 returns 时被垃圾收集,我不想要。如何在不同的函数中使用我感兴趣的存储对象调用相同的 std::vector?甚至调用相同的函数?

  2. 有没有更好的方法用 Matlab 做这个?本质上,我正在尝试使用 Matlab 来驱动一些 C++ 代码,这些代码完成了繁重的工作,然后将其全部带回 Matlab 进行分析。问题是 C++ 代码已经写好了,我需要尝试改变 Matlab 以适应那些 类.

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

参见以下文档:

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

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