2016-05-29 44 views
1

我有一个函数,我写作一个MATLAB mex文件。这个函数必须使用MEX,因为它与C++中的一个硬件接口。有很多可以设置的选项,我想用containers.Map来传递它们。 (否则,我需要大量的函数参数。)有没有办法从MATLAB mex文件中的地图中获取值?

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

我想,也许地图实现使用subsref此操作,但这种失败在MATLAB,所以我猜在MEX文件中的相应会失败,太:

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

你能只使用一个结构?然后你可以使用'mxGetField'和其他相关函数。 – horchler

+0

也许 - 我正在研究这个。 –

+0

是的 - 这对我很有用。谢谢!不过,我想我会把这个问题公开,因为有人可能仍然想要一个关于地图的答案。 –

回答

0

Upvote for @ nirvana-msu让我走上正轨。此外,感谢@horchler建议,使用struct而不是一个更好的主意。下面介绍如何在C访问containers.Map ++做一个在MATLAB与一个名为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); 
} 
2

你在使用错误的'type'subsref - 请使用'()',因为您使用()表示法访问containers.Map中的值,而不是像结构中那样使用点表示法)。下面的方法的工作原理:

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

ans = 
    3 

作为一个方面说明,我真的不知道,如果使用containers.Map是最好的方式。如果您创建明确的setter方法,则您的代码将更清晰。如果有太多属性,Builder design pattern可能会有所帮助。

相关问题