有没有办法从 MATLAB mex 文件中的地图中获取值?

Is there a way to get values out of a map in a MATLAB mex file?

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

我看不到任何访问使用键检索值的地图运算符的方法。我尝试使用 mexCallMATLAB,但我的各种方法都失败了。有办法吗?

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

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

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

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

ans =
     3

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

为@nirvana-msu 点赞,让我走上正轨。另外,感谢@horchler 建议使用 struct 代替是一个更好的主意。以下是如何在 MATLAB 中使用名为 foo:

的字段访问 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);
}