导入[]用于包含struct数组的MAT文件 - 只导入第一个元素?

时间:2011-07-04 04:40:55

标签: arrays matlab import struct wolfram-mathematica

我正在尝试从保存的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似乎能够处理这种情况。

2 个答案:

答案 0 :(得分:2)

有一个Mathematica包用于与MATLAB连接,可以从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开发人员之一。

答案 1 :(得分:0)

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

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

然后在mathematica:

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版。”。我希望这有帮助。