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

时间:2016-05-29 17:40:05

标签: matlab mex

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

ans =
     3

作为旁注,我不确定使用containers.Map是否是最好的方法。如果您创建显式setter方法,那么您的C++代码将更加清晰。如果属性太多,Builder design pattern会有所帮助。

答案 1 :(得分:0)

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

#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);
}