2

出于某种原因,hdf5write当我重新读取行向量时,MATLAB 中的方法会自动将它们转换为列向量:

>> 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 文件中。为了比较,我用一个实际的二维矩阵(以显示它的样子)、一个一维列向量、一个沿第三维的一维向量尝试同样的事情,并且,为了踢球,试试这个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. 该'V71Dimensions'标志没有帮助:生成的 hdf5 文件仍然是数据集 {10} 而不是数据集 {10,1}。

4

2 回答 2

4

问题在于阅读。从帮助

[...] = hdf5read(..., 'V71Dimensions', BOOL) 指定是否更改从文件中读取的大部分数据集。如果 BOOL 为真,hdf5read 会置换数据集的前两个维度,就像在以前的版本(MATLAB 7.1 [R14SP3] 及更早版本)中所做的那样。此行为旨在说明 HDF5 和 MATLAB 表达数组维度的方式不同。HDF5 以行优先顺序描述数据集维度;MATLAB 以列优先顺序存储数据。但是,排列这些维度可能无法正确反映数据的意图,并且可能会使元数据无效。当 BOOL 为 false(默认值)时,数据维度正确反映了写入文件中的数据顺序——输出变量中的每个维度与文件中的相同维度匹配。

因此:

hdf5write('/tmp/data.h5','/data',rand(1,10));
size(hdf5read('/tmp/data.h5','/data','V71Dimensions',true))
ans =
     1    10
于 2011-01-28T01:45:10.780 回答
1

我对此感到害怕,您将不得不使用 Matlab 的低级 HDF5 API。

在 Matlab 中,低级 API 可以使用例如H5.open(...)H5D.write(...)等等。这些名称与 C 库的名称完全对应(请参阅HDF5 文档)。然而,它们采用的参数略有不同,但 matlabhelp函数会告诉你你需要知道的一切......

好消息是 API 的 Matlab 版本仍然没有 C 版本那么冗长。例如,您不必手动关闭数据类型、数据空间等,因为当变量超出范围时,Matlab 会为您关闭它们。

于 2011-02-18T01:59:23.870 回答