.mat v7.3 文件中 char 和 uint16 编码的区别

Differences between encoding of char and uint16 in .mat v7.3 files

我正在尝试使用 h5py.

读取 python 文件中的 v7.3 matlab .mat

我遇到了字符数组(例如,通常包含单个字符串的 .mat 字段)和 uint16 数组的表示形式看起来相同的问题。

>> ushortarr = uint16([63 109 105 102])
>> strarr = 'gibl'
>> save('short_string_difference.mat', 'ushortarr', 'strarr', '-v7.3')

当加载回 matlab 时,matlab 能够检测这些变量的正确数据类型:

>> ss73 = load('short_string_difference.mat')
ss73 =
       strarr: 'gibl'
       ushortarr: [69 109 105 102]

但是h5py提示这个文件的结构如下:

(Pdb) strarr
<HDF5 dataset "strarr": shape (4, 1), type "<u2">
(Pdb) ushortarr
<HDF5 dataset "ushortarr": shape (4, 1), type "<u2">
(Pdb) strarr.value
array([[103],
       [105],
       [ 98],
       [108]], dtype=uint16)
(Pdb) ushortarr.value
array([[ 69],
       [109],
       [105],
       [102]], dtype=uint16)

(我还检查并确定 octave 与 v7.3 matlab 文件的 h5py 具有相似的行为,但是 scipy.io.loadmat 和 octave 对于旧的 >=v7 .mat 文件都有正确的行为。看通过错误报告表明他们没有修复 v7.3 mat 文件的这个问题或其他一些问题,而且他们根本不正式支持 v7.3)

我的问题是:h5py 忽略了哪些数据或其他技巧,matlab 在从该文件加载这些变量时使用它们来确定这些变量的类型?第二个问题是,是否有 python 实现的 reader 可以使此检查用于做出此决定的任何内容?

你得看看属性,可以通过以下方式访问:

strarr.attrs

在那里你会找到一个名为 MATLAB_class 的属性,它是 charuint16