我有一个函数,我写的是MATLAB mex文件。此函数必须使用MEX,因为它与C ++中的一个硬件接口。可以设置很多选项,我想使用containers.Map
来传递它们。 (否则,我需要大量的函数参数。)
我没有看到任何方法来访问使用密钥检索值的Map运算符。我尝试使用mexCallMATLAB
,但我的各种方法都失败了。有没有办法做到这一点?
我想也许Map使用subsref
实现了这个运算符,但这在MATLAB中失败了,所以我猜测mex文件中的等价物也会失败:
dict = containers.Map('foo', 3)
subsref(dict, struct('type', '.', 'subs', 'foo'))
答案 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);
}