从 mex 中的 matlab 结构中提取数据
Extracting data from a matlab struct in mex
我正在关注 this example,但我不确定自己错过了什么。具体来说,我在 MATLAB 中有这个结构:
a = struct; a.one = 1.0; a.two = 2.0; a.three = 3.0; a.four = 4.0;
这是我在 MEX 中的测试代码 ---
首先,我想确保我传递的是正确的东西,所以我做了这个检查:
int nfields = mxGetNumberOfFields(prhs[0]);
mexPrintf("nfields =%i \n\n", nfields);
它确实产生了 4
,因为我有四个字段。
但是,当我尝试提取字段 three
中的值时:
tmp = mxGetField(prhs[0], 0, "three");
mexPrintf("data =%f \n\n", (double *)mxGetData(tmp) );
它returns data =1.000000
。我不确定我做错了什么。我的逻辑是我想获取字段 three
的第一个元素(因此索引为 0),所以我期望 data =3.00000
.
我能得到指点或提示吗?
已编辑
好的,既然你没有提供完整的代码,但你正在进行测试,让我们试着从头开始做一个新的。
在 Matlab 端,使用以下代码:
a.one = 1;
a.two = 2;
a.three = 3;
a.four = 4;
read_struct(a);
现在,创建并编译 MEX read_struct
函数,如下所示:
#include "mex.h"
void read_struct(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
if (nrhs != 1)
mexErrMsgTxt("One input argument required.");
/* Let's check if the input is a struct... */
if (!mxIsStruct(prhs[0]))
mexErrMsgTxt("The input must be a structure.");
int ne = mxGetNumberOfElements(prhs[0]);
int nf = mxGetNumberOfFields(prhs[0]);
mexPrintf("The structure contains %i elements and %i fields.\n", ne, nf);
mwIndex i;
mwIndex j;
mxArray *mxValue;
double *value;
for (i = 0; i < nf; ++i)
{
for (j = 0; j < ne; ++j)
{
mxValue = mxGetFieldByNumber(prhs[0], j, i);
value = mxGetPr(mxValue);
mexPrintf("Field %s(%d) = %.1f\n", mxGetFieldNameByNumber(prhs[0],i), j, value[0]);
}
}
return;
}
这是否正确打印了您的结构?
我正在关注 this example,但我不确定自己错过了什么。具体来说,我在 MATLAB 中有这个结构:
a = struct; a.one = 1.0; a.two = 2.0; a.three = 3.0; a.four = 4.0;
这是我在 MEX 中的测试代码 ---
首先,我想确保我传递的是正确的东西,所以我做了这个检查:
int nfields = mxGetNumberOfFields(prhs[0]);
mexPrintf("nfields =%i \n\n", nfields);
它确实产生了 4
,因为我有四个字段。
但是,当我尝试提取字段 three
中的值时:
tmp = mxGetField(prhs[0], 0, "three");
mexPrintf("data =%f \n\n", (double *)mxGetData(tmp) );
它returns data =1.000000
。我不确定我做错了什么。我的逻辑是我想获取字段 three
的第一个元素(因此索引为 0),所以我期望 data =3.00000
.
我能得到指点或提示吗?
已编辑
好的,既然你没有提供完整的代码,但你正在进行测试,让我们试着从头开始做一个新的。
在 Matlab 端,使用以下代码:
a.one = 1;
a.two = 2;
a.three = 3;
a.four = 4;
read_struct(a);
现在,创建并编译 MEX read_struct
函数,如下所示:
#include "mex.h"
void read_struct(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
if (nrhs != 1)
mexErrMsgTxt("One input argument required.");
/* Let's check if the input is a struct... */
if (!mxIsStruct(prhs[0]))
mexErrMsgTxt("The input must be a structure.");
int ne = mxGetNumberOfElements(prhs[0]);
int nf = mxGetNumberOfFields(prhs[0]);
mexPrintf("The structure contains %i elements and %i fields.\n", ne, nf);
mwIndex i;
mwIndex j;
mxArray *mxValue;
double *value;
for (i = 0; i < nf; ++i)
{
for (j = 0; j < ne; ++j)
{
mxValue = mxGetFieldByNumber(prhs[0], j, i);
value = mxGetPr(mxValue);
mexPrintf("Field %s(%d) = %.1f\n", mxGetFieldNameByNumber(prhs[0],i), j, value[0]);
}
}
return;
}
这是否正确打印了您的结构?