【问题标题】:Interacting with C++ objects through Mex files通过 Mex 文件与 C++ 对象交互
【发布时间】:2017-10-25 18:04:03
【问题描述】:

我目前的目标是否可行,如果可行,该怎么做。我希望通过 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 文件中返回非 Matlab 类型(我知道),Mathworks 说 Mex 函数中的局部变量通常在函数返回时被垃圾收集,这是我不想要的。如何跨不同函数调用具有我感兴趣的存储对象的相同 std::vector?甚至调用相同的函数?

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

【问题讨论】:

    标签: c++ matlab mex


    【解决方案1】:

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

    请参阅以下文档:

    还可以在 Mathworks 网站上查看此答案: How can I make memory persistent between calls to a MEX-file in MATLAB

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

    【讨论】:

    • 谢谢,但我认为 mexMakePersistent 方法不适用于非 Matlab 对象(我需要与之交互)。我相信只需将所需的变量声明为静态就可以了,尽管我还没有尝试过这种情况。
    • 我还找到了this on Mathworks Answers。它引用了 GitHub 存储库。设计目标听起来更接近您正在寻找的东西。这听起来确实比将变量声明为静态要复杂得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 2017-01-11
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    相关资源
    最近更新 更多