Ошибка "Ожидание типа miMATRIX" при чтении MATLAB MAT-файла с помощью SciPy

Это вопрос MATLAB: проблема вызвана взаимодействием с файлами MATLAB и Python / numpy. Я привязываю написать трехмерный массив типа uint8 в MATLAB, а затем прочитать его на Python с помощью numpy. Это код MATLAB, который создает файл:

voxels = zeros(30, 30, 30);
....
fileID1 = fopen(fullFileNameOut,'w','s');
fwrite(fileID1, voxels, 'uint8');
fclose(fileID1);

Это код Python, который пытается прочитать файл:

filename = 'File3DArray.mat'
arr = scipy.io.loadmat(filename)['instance'].astype(np.uint8)

Это ошибка, которую я получаю при запуске кода Python: (Я думаю, что это источник проблемы. Что такое MM

raise TypeError('Expecting miMATRIX type here, got %d' % mdtype)

Это результат команды Linux file в файле 3D-массива. которые я создал (думаю, это источник проблемы. Что такое почтовый ящик MMDF?):

File3DArray.mat: MMDF mailbox

Это результат того же файла команды Linux для другого файла 3D-массива. который был создан кем-то еще в MATLAB:

GoodFile.mat: Matlab v5 mat-file (little endian) version 0x0100

Я хочу, чтобы файлы, которые я создаю в MATLAB, были такими же, как GoodFile.mat (чтобы я мог читать их с помощью приведенного выше сегмента кода Python / Numpy). Я думаю, что вывод команды Linux 'file' должен быть таким же, как вывод GoodFile. Что это за код MATLAB?

file просматривает (среди прочего) первые несколько байтов файла и сравнивает их с магическими строками. Вероятно, это причина того, что он идентифицирует ваш файл как «почтовый ящик MMDF», чем бы он ни был. Ваши первые несколько байтов данных просто совпадают.
Cris Luengo 18.12.2018 22:30
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
2
1
456
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы создать MAT-файл, используйте команду MATLAB save:

voxels = zeros(30, 30, 30, 'uint8');
save(fullFileNameOut, 'voxels', '-v7')

Вам нужно добавить '-v7' (или '-v6') в качестве аргумента к save, чтобы создать файл в более старом формате, поскольку SciPy не распознает файлы '-v7.3' создается по умолчанию.

Хорошо. Но в ошибке упоминается v5. Стоит ли использовать аргумент -v5?

JB_User 18.12.2018 22:36

Хорошо '-v6' сработал (нет опции '-v5'). Спасибо. Я бы никогда не понял этого самостоятельно.

JB_User 18.12.2018 22:58

Чтобы прочитать v7.3 matlab на python, используйте h5py. Например, import h5py; f = h5py.File( 'my.mat', 'r' ); x = np.array( f.get( 'data/x' ))

denis 20.04.2020 17:33

Другие вопросы по теме