如何在MATLAB中将行向量保存到HDF?

时间:2011-01-28 01:16:58

标签: matlab hdf5

出于某种原因,当我重新读取它时,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维数组。为了比较,我尝试使用实际的二维矩阵(以显示它的样子),一维列向量,沿第三维的一维向量,以及对于踢,尝试{{在V71Dimensionshdf5read

的帮助中的1}}技巧
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}。

2 个答案:

答案 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会为您关闭它们。