【问题标题】:Is there a way to get values out of a map in a MATLAB mex file?有没有办法从 MATLAB mex 文件中的地图中获取值?
【发布时间】:2016-05-29 17:40:05
【问题描述】:

我有一个正在编写为 MATLAB mex 文件的函数。此函数必须使用 MEX,因为它与 C++ 中的一个硬件接口。有很多选项可以设置,我想使用containers.Map 来传递它们。 (否则,我需要大量的函数参数。)

我看不到任何方法可以访问使用键检索值的 Map 运算符。我尝试使用mexCallMATLAB,但我的各种方法都失败了。有没有办法做到这一点?

我想也许 Map 使用 subsref 实现了这个运算符,但这在 MATLAB 中失败了,所以我猜测 mex 文件中的等价物也会失败:

dict = containers.Map('foo', 3)
subsref(dict, struct('type', '.', 'subs', 'foo'))

【问题讨论】:

  • 你可以只使用一个结构吗?然后就可以使用mxGetField等相关功能了。
  • 也许 - 我现在正在调查。
  • 是的 - 这对我有用。谢谢!不过,我想我会保留这个问题,因为有人可能仍然想要关于地图的答案。
  • 太棒了。如果您编辑您的问题以提供一个您正在尝试做的最小示例,这将有所帮助(我不清楚您为什么需要使用subsindex)。
  • 您也可以为您的属性创建单独的 setter 方法和/或使用 Builder 设计模式。这在 Matlab 中并不常见,但在 C++ 等语言中通常是这样做的

标签: matlab mex


【解决方案1】:

您在subsref 中使用了错误的'type' - 请改用'()',因为您在containers.Map 中使用() 表示法访问值,而不是像在结构中那样使用点表示法)。以下方法有效:

dict = containers.Map('foo', 3);
subsref(dict, struct('type', '()', 'subs', 'foo'))

ans =
     3

附带说明,我不确定使用containers.Map 是否是最好的方法。如果您创建显式 setter 方法,您的 C++ 代码会更简洁。如果属性太多,Builder design pattern 会很有帮助。

【讨论】:

    【解决方案2】:

    支持@nirvana-msu 让我走上正轨。另外,感谢@horchler 建议使用struct 是一个更好的主意。以下是在 MATLAB 中使用名为 foo 的字段创建 containers.Map 后如何在 C++ 中访问 containers.Map

    #include <mex.h>
    
    void mexFunction(int nlhs, mxArray *plhs[],
                     int nrhs, const mxArray *prhs[]) {
        mxArray *args[2];
        args[0] = const_cast<mxArray*>(prhs[0]);
    
        const char **fields = (const char **) mxCalloc(2, sizeof(*fields));
        fields[0] = "type";
        fields[1] = "subs";
    
        args[1] = mxCreateStructMatrix(1, 1, 2, fields);
        auto typeStr = mxCreateString("()");
        mxSetField(args[1], 0, "type", typeStr);
        auto mapKey = mxCreateString("foo");
        mxSetField(args[1], 0, "subs", mapKey);
    
        mxArray *output;
        mexCallMATLAB(1, &output, 2, args, "subsref");
        mexPrintf("%f\n", mxGetScalar(output));
        mxDestroyArray(args[1]);
        mxFree(fields);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 2022-01-07
      • 2011-02-05
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      相关资源
      最近更新 更多