2011-01-28 2 views
2

は、MATLABでhdf5writeメソッドが自動的に列ベクトルに私の行ベクトルに変換され、それらを再読み込み:MATLABで行ベクトルをHDFに保存するにはどうすればよいですか?私は時に何らかの理由

>> 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が行ベクトルのために正しいことを行うために得ることができますか?彼らは私が代わりにhdf5readの、実際に後でデータを読み取るために、CベースのMEXを使用していますので、ない10×1

編集問題はもう少し複雑である、1×10として戻ってくるべきです。また、問題は本当にhdf5writeであり、これはHDF5ファイル自体に見える:

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

data      Dataset {10} 

は、データがHDF5ファイル内の1次元配列として保存されます。比較のために、実際の2次元行列(それがどのように見えるか)、1次元列ベクトル、3次元次元に沿った1次元ベクトル、同じくキックの場合はV71Dimensionsトリックを試してみますhdf5readhdf5write両方のヘルプにある:

>> 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

これは問題です。 help

[...] =関数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 
1

私は、MATLABの低レベルHDF5のAPIを使用する必要があります。このためaffraidです。

Matlabでは、低レベルのAPIは、例えばH5.open(...)H5D.write(...)などを使用して利用できます。名前はCライブラリの名前に正確に対応しています(HDF5 doc参照)。しかし、彼らが取る議論にわずかな違いがありますが、matlab help関数は、あなたが知る必要があるすべてを教えてくれます...

良いニュースは、MatlabバージョンのAPIはまだCよりもあまり冗長ではないバージョン。たとえば、変数が有効範​​囲外になると、Matlabはそれらを閉じてしまうため、データ型、データスペースなどを手動で閉じる必要はありません。

関連する問題