Импорт[] за мат-файл, содержащий структуры массивов - импортирует только первый элемент?


Я пытаюсь импортировать данные из сохраненного массива MATLAB struct, но, похоже, 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');

Mathematica

In[76]:= Import["test.mat", "LabeledData"]
Out[76]= {"data" -> {"x" -> {{1.}}, "y" -> {{2.}}, "z" -> {{3.}}}}
Кто-нибудь знает, почему это происходит?

В качестве временного исправления я просто прибегнул к хранению нескольких структур в массиве ячеек, т. е.

data{i} = struct(...)

Mathematica, кажется, может справиться с этим прекрасно.

2 5

2 ответа:

Я действительно не могу объяснить поведение, но для того, чтобы иметь возможность читать файлы в 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 говорится, что "импорт полностью поддерживает версии 4 и 5 формата MAT.". Надеюсь, это поможет.

Существует пакет 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.