【问题标题】:Import[] for MAT file containing struct arrays - Only imports first element?包含结构数组的 MAT 文件的 Import[] - 仅导入第一个元素?
【发布时间】:2023-03-23 08:21:01
【问题描述】:

我正在尝试从已保存的 MATLAB 结构数组中导入数据,但 Mathematica 似乎只导入了第一个元素。

MATLAB

blank = struct('x', [], 'y', [], 'z', []);
data = repmat(blank, 1, 10);

for i = 1:10
    data(i) = struct('x', i, 'y', i * 2, 'z', i * 3);
end

save('test.mat', 'data');

数学

In[76]:= Import["test.mat", "LabeledData"]
Out[76]= {"data" -> {"x" -> {{1.}}, "y" -> {{2.}}, "z" -> {{3.}}}}

有人知道为什么会这样吗?

作为临时修复,我只是将多个结构存储在一个单元数组中,即

data{i} = struct(...)

Mathematica 似乎能够处理得很好。

【问题讨论】:

标签: arrays matlab import struct wolfram-mathematica


【解决方案1】:

有一个用于与 MATLAB 接口的 Mathematica 包,可以从 MATLAB 传输结构。见这里:MATLink

这是您在 MATLink 中进行传输的方式:

Needs["MATLink`"]

MEvaluate["
 blank = struct('x', [], 'y', [], 'z', []);
 data = repmat(blank, 1, 10);

 for i = 1:10
     data(i) = struct('x', i, 'y', i * 2, 'z', i * 3);
 end"]

MGet["data"]

{{"x" -> 1., "y" -> 2., "z" -> 3.}, {"x" -> 2., "y" -> 4., 
  "z" -> 6.}, {"x" -> 3., "y" -> 6., "z" -> 9.}, {"x" -> 4., 
  "y" -> 8., "z" -> 12.}, {"x" -> 5., "y" -> 10., 
  "z" -> 15.}, {"x" -> 6., "y" -> 12., "z" -> 18.}, {"x" -> 7., 
  "y" -> 14., "z" -> 21.}, {"x" -> 8., "y" -> 16., 
  "z" -> 24.}, {"x" -> 9., "y" -> 18., "z" -> 27.}, {"x" -> 10., 
  "y" -> 20., "z" -> 30.}}

免责声明:我是 MATLink 开发人员之一。

【讨论】:

  • 哇,看起来棒极了!我最近使用了一个类似的库,mlabwrap,在 Python 中做类似的事情。这些库无疑使接口变得更容易,所以感谢您为他们付出的努力! (并且在需要时一定会使用它!)
  • 看起来非常棒。下次使用 MATLAB 时,我必须牢记这一点。顺便说一句,很棒的 MATLink 网站,喜欢这个设计。我有一种感觉,我最终会从中模仿很多设计概念。
  • @jmlopez 谢谢,我会把它转给做网页设计的人 :) 如果您对 MATLink 有任何问题,请随时给我发电子邮件
【解决方案2】:

我无法真正解释这种行为,但为了能够在 Mathematica 中读取文件,最好指定您正在使用的 Matlab 版本。在 MATLAB 中尝试使用版本 6 保存数据。

>> save('test.mat', '-v6', 'data')

然后在数学中:

In[1]:= Import["test.mat", "LabeledData"]
Out[1]= {"data" -> {"x" -> {{1.}}, "y" -> {{2.}}, "z" -> {{3.}}}, {{2.}}, {{4.}}, {{6.}}, {{3.}}, {{6.}}, {{9.}}, {{4.}}, {{8.}}, {{12.}}, {{5.}}, {{10.}}, {{15.}}, {{6.}}, {{12.}}, {{18.}}, {{7.}}, {{14.}}, {{21.}}, {{8.}}, {{16.}}, {{24.}}, {{9.}},{{18.}}, {{27.}}, {{10.}}, {{20.}}, {{30.}}}

我尝试使用 v4 进行保存,但这在 MATLAB 中不起作用。请注意,Mathematica 中的文档说“Import 完全支持 MAT 格式的版本 4 和 5。”。我希望这会有所帮助。

【讨论】:

  • 对不起,我没有注意到只有第一个结构被保存为一个列表,其余的只是作为单例。我能想到的唯一快速解决方案是将数据展平,然后分区以获取我们可以在 MATLAB 中执行此操作的列表。
猜你喜欢
  • 2014-05-08
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 2014-12-20
  • 2014-04-26
相关资源
最近更新 更多