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 函数检索指向第一个元素的指针,并写入该数组。