📄 contactinfo.asv
字号:
// 头文件
#include "mex.h"
#include "string.h"
#define MAXCHARS 80 /* 指定每个域可以包含的最大字符数 */
/* 接口函数 */
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
const char **fnames; /* 指向域名的指针 */
const int *dims;
mxArray *tmp, *fout;
char *pdata;
int ifield, jstruct, *classIDflags;
int NStructElems, nfields, ndim;
/* 检查输入输出是否正确 */
if (nrhs != 1)
mexErrMsgTxt("One input required.");
else if (nlhs > 1)
mexErrMsgTxt("Too many output arguments.");
else if (!mxIsStruct(prhs[0]))
mexErrMsgTxt("Input must be a structure.");
/* 获取输入数据 */
nfields = mxGetNumberOfFields(prhs[0]);
NStructElems = mxGetNumberOfElements(prhs[0]);
/* 为classIDflags分配内存 */
classIDflags = mxCalloc(nfields, sizeof(int));
/* 检查区域是否空白,数据类型是否正确和一致,为每个域获取classID */
for (ifield = 0; ifield < nfields; ifield++) {
for (jstruct = 0; jstruct < NStructElems; jstruct++) {
tmp = mxGetFieldByNumber(prhs[0], jstruct, ifield);
if (tmp == NULL) {
mexPrintf("%s%d\t%s%d\n",
"FIELD:", ifield+1, "STRUCT INDEX :", jstruct+1);
mexErrMsgTxt("Above field is empty!");
}
if (jstruct == 0) {
if ((!mxIsChar(tmp) && !mxIsNumeric(tmp)) ||
mxIsSparse(tmp)) {
mexPrintf("%s%d\t%s%d\n",
"FIELD:", ifield+1, "STRUCT INDEX :", jstruct+1);
mexErrMsgTxt("Above field must have either "
"string or numeric non-sparse data.");
}
classIDflags[ifield] = mxGetClassID(tmp);
} else {
if (mxGetClassID(tmp) != classIDflags[ifield]) {
mexPrintf("%s%d\t%s%d\n",
"FIELD:", ifield+1, "STRUCT INDEX :", jstruct+1);
mexErrMsgTxt("Inconsistent data type in above field!");
}
else if (!mxIsChar(tmp) && ((mxIsComplex(tmp) ||
mxGetNumberOfElements(tmp) != 1))) {
mexPrintf("%s%d\t%s%d\n",
"FIELD:", ifield+1, "STRUCT INDEX :", jstruct+1);
mexErrMsgTxt("Numeric data in above field "
"must be scalar and noncomplex!");
}
}
}
}
/* 为保存指针分配内存 */
fnames = mxCalloc(nfields, sizeof(*fnames));
/* 获得每个字段名指针 */
for (ifield = 0; ifield < nfields; ifield++) {
fnames[ifield] = mxGetFieldNameByNumber(prhs[0],ifield);
}
/* 创建输出的1x1结构体矩阵 */
plhs[0] = mxCreateStructMatrix(1, 1, nfields, fnames);
mxFree(fnames);
ndim = mxGetNumberOfDimensions(prhs[0]);
dims = mxGetDimensions(prhs[0]);
for (ifield = 0; ifield < nfields; ifield++) {
/* 创建单元或数值矩阵 */
if (classIDflags[ifield] == mxCHAR_CLASS) {
fout = mxCreateCellArray(ndim, dims);
} else {
fout = mxCreateNumericArray(ndim, dims,
classIDflags[ifield], mxREAL);
pdata = mxGetData(fout);
}
/* 从输入结构体矩阵中拷贝数据 */
for (jstruct = 0; jstruct < NStructElems; jstruct++) {
tmp = mxGetFieldByNumber(prhs[0],jstruct,ifield);
if (mxIsChar(tmp)) {
mxSetCell(fout, jstruct, mxDuplicateArray(tmp));
} else {
size_t sizebuf;
sizebuf = mxGetElementSize(tmp);
memcpy(pdata, mxGetData(tmp), sizebuf);
pdata += sizebuf;
}
}
/* Set each field in output structure */
mxSetFieldByNumber(plhs[0], 0, ifield, fout);
}
mxFree(classIDflags);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -