2

何らかの理由で、hdf5writeMATLAB のメソッドは、行ベクトルを再度読み取ると、行ベクトルを列ベクトルに自動的に変換します。

>> hdf5write('/tmp/data.h5','/data',rand(1,10));
>> size(hdf5read('/tmp/data.h5','/data'))

ans =

    10     1

ただし、3 次元の行ベクトルの場合は、問題なく返されます。

>> hdf5write('/tmp/data.h5','/data',rand(1,1,10));
>> size(hdf5read('/tmp/data.h5','/data'))

ans =

     1     1    10

hdf5write行ベクトルに対して正しいことを行うにはどうすればよいですか? 10 x 1 ではなく、1 x 10 として戻ってくるはずです。

編集ではなく、後で実際にデータを読み取るために c ベースの mex を使用しているため、問題は少し複雑ですhdf5read。さらに、問題は実際には にhdf5writeあり、これは hd​​f5 ファイル自体に表示されます。

>> hdf5write('/tmp/data.h5','/data',randn(1,10));
>> ! h5ls /tmp/data.h5

data                     Dataset {10}

つまり、データは 1 次元配列として hdf5 ファイルに保存されます。比較のために、実際の 2 次元行列 (どのように見えるかを示すため)、1 次元列ベクトル、3 次元に沿った 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。フラグは役に立ちません。'V71Dimensions'結果の hdf5 ファイルは、データセット {10,1} ではなくデータセット {10} のままです。

4

2 に答える 2

4

読み方が問題です。ヘルプから

[...] = hdf5read(..., 'V71Dimensions', BOOL) は、ファイルから読み取ったデータ セットの大部分を変更するかどうかを指定します。BOOL が true の場合、 hdf5read は、以前のリリース (MATLAB 7.1 [R14SP3] 以前) と同様に、データ セットの最初の 2 つの次元を並べ替えます。この動作は、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 を使用する必要があります。

H5.open(...)Matlab では、インスタンスなどを使用して低レベル API を利用できますH5D.write(...)。名前は、C ライブラリの名前に正確に対応しています ( HDF5 docを参照)。ただし、それらが取る引数にはわずかな違いがありhelpますが、知っておくべきことはすべて matlab 関数が教えてくれます...

幸いなことに、API の Matlab バージョンは C バージョンよりもまだ冗長ではありません。たとえば、データ型、データスペースなどを手動で閉じる必要はありません。変数がスコープ外になると、Matlab がそれらを閉じてくれるからです。

于 2011-02-18T01:59:23.870 に答える