Это вопрос 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?
Чтобы создать MAT-файл, используйте команду MATLAB save
:
voxels = zeros(30, 30, 30, 'uint8');
save(fullFileNameOut, 'voxels', '-v7')
Вам нужно добавить '-v7'
(или '-v6'
) в качестве аргумента к save
, чтобы создать файл в более старом формате, поскольку SciPy не распознает файлы '-v7.3'
создается по умолчанию.
Хорошо. Но в ошибке упоминается v5. Стоит ли использовать аргумент -v5?
Хорошо '-v6' сработал (нет опции '-v5'). Спасибо. Я бы никогда не понял этого самостоятельно.
Чтобы прочитать v7.3 matlab на python, используйте h5py. Например, import h5py; f = h5py.File( 'my.mat', 'r' ); x = np.array( f.get( 'data/x' ))
file
просматривает (среди прочего) первые несколько байтов файла и сравнивает их с магическими строками. Вероятно, это причина того, что он идентифицирует ваш файл как «почтовый ящик MMDF», чем бы он ни был. Ваши первые несколько байтов данных просто совпадают.