MATLAB结构数组,mex和内存

时间:2018-03-14 23:05:14

标签: matlab mex

我在找到这个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工作区。任何帮助将不胜感激!

1 个答案:

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