出于某种原因,当我重新读取它时,MATLAB中的hdf5write
方法会自动将我的行向量转换为列向量:
>> hdf5write('/tmp/data.h5','/data',rand(1,10));
>> size(hdf5read('/tmp/data.h5','/data'))
ans =
10 1
但是,对于第三维中的行向量,它可以很好地回复:
>> hdf5write('/tmp/data.h5','/data',rand(1,1,10));
>> size(hdf5read('/tmp/data.h5','/data'))
ans =
1 1 10
如何让hdf5write
为行向量做正确的事情?它们应该以1 x 10而不是10 x 1的形式返回。
编辑问题稍微复杂一点,因为我使用基于c的mex来实际读取数据,而不是hdf5read
。此外,问题真的在hdf5write
中,这在hdf5文件本身中可见:
>> hdf5write('/tmp/data.h5','/data',randn(1,10));
>> ! h5ls /tmp/data.h5
data Dataset {10}
即,数据在hdf5文件中保存为1维数组。为了比较,我尝试使用实际的二维矩阵(以显示它的样子),一维列向量,沿第三维的一维向量,以及对于踢,尝试{{在V71Dimensions
和hdf5read
:
hdf5write
所以,问题似乎确实存在于>> hdf5write('/tmp/data.h5','/data',randn(10,1)); %1-d col vector
>> ! h5ls /tmp/data.h5
data Dataset {10}
>> hdf5write('/tmp/data.h5','/data',randn(1,1,10)); %1-d vector along 3rd dim; annoying
>> ! h5ls /tmp/data.h5
data Dataset {10, 1, 1}
>> hdf5write('/tmp/data.h5','/data',randn(2,5)); %2-d matrix. notice the reversal in dim order
>> ! h5ls /tmp/data.h5
data Dataset {5, 2}
>> hdf5write('/tmp/data.h5','/data',randn(1,10),'V71Dimensions',true); %1-d row; option does not help
>> ! h5ls /tmp/data.h5
data Dataset {10}
中。 hdf5write
标志没有帮助:生成的hdf5文件仍然是数据集{10}而不是数据集{10,1}。
答案 0 :(得分:4)
阅读是一个问题。来自help
[...] = hdf5read(...,'V71Dimensions', BOOL)指定是否更改 大多数数据集都是从中读取的 文件。如果BOOL为true,则为hdf5read 置换前两个维度 数据集,就像之前一样 发布(MATLAB 7.1 [R14SP3]和 更早)。此行为是有意的 考虑到如何区别 HDF5和MATLAB表达阵列 尺寸。 HDF5描述了数据集 行主要维度; MATLAB 以列主要顺序存储数据。 但是,要排列这些尺寸 可能无法正确反映意图 的数据可能会失效 元数据。当BOOL为假时( 默认),数据维度 正确反映数据排序为 它写在文件中 - 每个 输出变量中的维度 匹配相同的维度 文件。
因此:
hdf5write('/tmp/data.h5','/data',rand(1,10));
size(hdf5read('/tmp/data.h5','/data','V71Dimensions',true))
ans =
1 10
答案 1 :(得分:1)
我很担心你必须使用Matlab的低级HDF5 API。
在Matlab中,可以使用低级API,例如H5.open(...)
,H5D.write(...)
等。这些名称与C库的名称完全一致(参见HDF5 doc)。但是他们所采用的论点略有不同,但matlab help
函数会告诉你需要知道的一切......
好消息是,API的Matlab版本仍然比C版本更简洁。例如,您不必手动关闭数据类型,数据空间等,因为当变量超出范围时,Matlab会为您关闭它们。