“Expecting miMATRIX type” error when reading MATLAB MAT-file with SciPy
这是一个MATLAB问题:问题是由与MATLAB文件和Python / numpy的交互引起的。我想在MATLAB中编写uint8类型的3-D数组,然后在Python中使用numpy读取它。这是创建文件的MATLAB代码:
1 2 3 4 5
| voxels = zeros(30, 30, 30);
....
fileID1 = fopen(fullFileNameOut, 'w', 's');
fwrite(fileID1, voxels, 'uint8');
fclose(fileID1 ); |
这是尝试读取文件的Python代码:
1 2
| filename = 'File3DArray.mat'
arr = scipy. io. loadmat(filename )['instance']. astype(np. uint8) |
这是运行python代码时遇到的错误:(我认为这是问题的根源。什么是MM
1
| raise TypeError('Expecting miMATRIX type here, got %d' % mdtype) |
这是3D阵列文件上Linux命令'file'的输出
我创建的(我认为这是问题的根源。什么是MMDF邮箱?):
1
| File3DArray.mat: MMDF mailbox |
这是另一个3D阵列文件上相同Linux命令"文件"的输出
由其他人在MATLAB中创建的:
1
| GoodFile. mat: Matlab v5 mat-file (little endian ) version 0x0100 |
我希望我在MATLAB中创建的文件与GoodFile.mat相同(以便我可以使用上面的Python / Numpy代码段读取它们)。我认为,Linux"文件"命令的输出应与GoodFile的输出相同。
那是什么的MATLAB代码?
-
file(除其他外)查看文件的前几个字节,并将其与魔术字符串进行比较。 不管是什么,这可能都是将文件标识为" MMDF邮箱"的原因。 您的前几个数据字节恰好匹配。
要创建MAT文件,请使用MATLAB save命令:
1 2
| voxels = zeros(30, 30, 30, 'uint8');
save(fullFileNameOut, 'voxels', '-v7') |
您需要添加'-v7'(或'-v6')作为save的参数以创建较旧格式的文件,因为SciPy无法识别默认创建的'-v7.3'文件。
-
好的。 但是错误提到v5。 我应该使用-v5参数吗?
-
-v6可以正常工作(没有-v5选项)。 谢谢。 我从来没有想过要靠自己。
-
要在python中阅读v7.3 matlab,请使用h5py。 例如,import h5py; f = h5py.File( my.mat, r ); x = np.array( f.get( datax ))