我有以下c矢量:
std::vector<myStruct> myVec;
myStruct包含的位置:
struct myStruct {
Point3D start;
Point3D end;
double lenght;
}
struct Point3D {
double x, y, z;
}
现在在我的mex文件中,我想将其转换为mxArray,同时保持相同的结构 .
当前(不起作用)代码:
// basic 'out'
mxArray *out;
mwSize dims[2] = { 1, 1 };
const char *pointField[] = {"point"};
const char *fields[] = {"start", "end","lenght"};
const char *3dFields[] = {"x", "y", "z"};
out = mxCreateStructArray(2,dims,(int)myVec.size(),pointField);
for( int i = 0 ; i < myVec.size() ; ++i)
{
// create struct to fill
mxArray *point = mxCreateStructArray(2, dims, 3, fields);
// create struct for start
mxArray *start= mxCreateStructArray(2, dims, 3, 3dFields);
mxSetField( start, 0, "x", mxCreateDoubleScalar(myVec[i].start.x) );
mxSetField( start, 0, "y", mxCreateDoubleScalar(myVec[i].start.y) );
mxSetField( start, 0, "z", mxCreateDoubleScalar(myVec[i].start.z) );
// create struct for end
mxArray *end= mxCreateStructArray(2, dims, 3, 3dFields);
mxSetField( end, 0, "x", mxCreateDoubleScalar(myVec[i].end.x) );
mxSetField( end, 0, "y", mxCreateDoubleScalar(myVec[i].end.y) );
mxSetField( end, 0, "z", mxCreateDoubleScalar(myVec[i].end.z) );
// add start + end to 'point'
mxSetField( point, 0, "start", start);
mxSetField( point, 0, "end", end);
mxSetField( point, 0, "lenght", mxCreateDoubleScalar(myVec[i].lenght) );
// add completed 'point' struct to out at given index i
mxSetField(out, i, "point", point );
}
plhs[0] = out;
正如你所看到的,重要的是我可以有1个输出值,它可以包含多个“点” - 结构,每个点都有一个start(xyz)-struct,end(xyz)-struct和lenght值 .
到目前为止,这段代码只以正确的格式输出1个单一结构,但是对于第二次迭代,它只在“点”所在的级别直接创建一个空的“结束”值 .
我需要更改才能正常工作?
提前致谢!
2 回答
这是我的实现:
vec_struct.cpp
我们从MATLAB编译并调用MEX函数:
如您所见,这将创建长度为10的structure array . 例如,第5个结构的访问方式如下:
上面的MEX文件等同于以下MATLAB代码:
我看到两个问题(不一定完整):
out
在代码中创建为标量结构,而应该是out = mxCreateStructMatrix(1, (int)myVec.size(), 3, pointField);
const char *fields[] = {"start", "end","depth"};
,但之后尝试设置lenght
字段 .第一个问题可能是您观察的原因 - 在mex中,您必须适当地预分配结构矩阵 .