我在找到这个m代码片段的mex analagous概念时有点迷失:
a.one = linspace(1,100);
a.two = linspace(101,200);
a.three = linspace(201,300);
for it = 1:100
b(it).one = it;
b(it).two = it+100;
b(it).three = it+200;
end
运行上面的m代码会生成两个结构,每个结构都具有相同的内容:
>> a
a =
struct with fields:
one: [1×100 double]
two: [1×100 double]
three: [1×100 double]
>> b
b =
1×100 struct array with fields:
one
two
three
但内存消耗大不相同:
>> whos
Name Size Bytes Class Attributes
a 1x1 2928 struct
b 1x100 36192 struct
我正在学习mex函数,数据类型等的深度,并且无法找出等效的mex实现来重新创建' a'和' b'在mex函数中并将它们返回到MATLAB工作区。任何帮助将不胜感激!
答案 0 :(得分:1)
在MEX文件中,函数mxCreateStructMatrix
用于创建结构矩阵,mxSetField
用于为其分配数组。
要在C MEX文件中复制M文件代码,您可以执行以下操作:
// Define field names
const char* fieldNames[] = {"one", "two", "three"};
// a: scalar struct with matrix elements
mxArray* a = mxCreateStructMatrix(1, 1, 3, fieldNames);
mxArray* elem = mxCreateDoubleMatrix(1, 100, mxREAL);
// fill `elem` with values 1-100
mxSetField(a, 0, fieldNames[0], elem);
elem = mxCreateDoubleMatrix(1, 100, mxREAL);
// fill `elem` with values 101-200
mxSetField(a, 0, fieldNames[1], elem);
elem = mxCreateDoubleMatrix(1, 100, mxREAL);
// fill `elem` with values 201-300
mxSetField(a, 0, fieldNames[2], elem);
// b: matrix struct with scalar elements
mxArray* b = mxCreateStructMatrix(1, 100, 3, fieldNames);
for (int it=1; it != 101; ++it) {
mxSetField(b, it, fieldNames[0], mxCreateDoubleScalar(it));
mxSetField(b, it, fieldNames[1], mxCreateDoubleScalar(it+100));
mxSetField(b, it, fieldNames[2], mxCreateDoubleScalar(it+200));
}
我遗漏了使用值填充elem
矩阵的代码,它涉及使用mxGetPr
函数来检索指向第一个元素的指针,并写入该数组。