MATLAB 结构数组、mex 和内存
MATLAB structure arrays, mex, and memory
我在寻找与此 m 代码片段类似的 mex 概念时有点迷茫:
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 工作区。如有任何帮助,我们将不胜感激!
在 MEX-file 中,函数 mxCreateStructMatrix
is used to create the struct matrix, and mxSetField
将数组分配给它。
要在 C MEX-file 中复制您的 M-file 代码,您需要这样做:
// 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
函数检索指向第一个元素的指针,并写入该数组。
我在寻找与此 m 代码片段类似的 mex 概念时有点迷茫:
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 工作区。如有任何帮助,我们将不胜感激!
在 MEX-file 中,函数 mxCreateStructMatrix
is used to create the struct matrix, and mxSetField
将数组分配给它。
要在 C MEX-file 中复制您的 M-file 代码,您需要这样做:
// 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
函数检索指向第一个元素的指针,并写入该数组。