【问题标题】:MATLAB structure arrays, mex, and memoryMATLAB 结构体数组、mex 和内存
【发布时间】:2018-03-14 23:05:13
【问题描述】:

在找到这个 m-code sn-p 的 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”并将它们返回到MATLAB 工作区。任何帮助将不胜感激!

【问题讨论】:

  • “运行上面的 m 代码会产生两个结构,每个结构都有 相同的 内容”。但他们不是。您刚刚说明了struct 数组的每个元素似乎都有自己的内存分配。干得好!
  • 它们是不同的。 a 是 1x1 结构,包含 3 个数组,b 是 1x100 结构,每个结构包含 3 个数组
  • 是的,没错。我完全承认这一点,这实际上是我提出问题的根本基础。我的问题是如何从 mex 复制这种相似但根本不同的结构。有什么建议,或者只是讽刺@Argyll?
  • 为了澄清这一点,它们在存储的数据量方面是相同的,但在内存占用方面却不同。用 Mathworks 自己的话来说,“即使 S1 和 S2 包含相同数量的数据 [...]”来自 mathworks.com/help/matlab/matlab_prog/…,请查找 S1 和 S2 的比较。我想您知道这一点,但不会费心提供在 mex 中重新创建“a”和“b”结构的解决方案。谢谢。
  • 讽刺?我建议编辑您刚刚在您的问题中告诉我的内容,以使其更清楚。老实说,即便如此,我仍然不确定你在问什么。 matlab 管理内存的方式是专有的,很难确定。

标签: matlab mex


【解决方案1】:

在 MEX 文件中,函数 mxCreateStructMatrix 用于创建结构矩阵,mxSetField 用于向其中分配数组。

要将您的 M 文件代码复制到 C MEX 文件中,您需要执行以下操作:

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

【讨论】:

  • 谢谢,克里斯。正是我想要的。很清楚。
猜你喜欢
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
相关资源
最近更新 更多