有没有办法从 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);
}
我有一个正在编写为 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
:
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);
}