2011-01-28 56 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做正確的事情行向量?他們應該回來爲1×10,而不是10×1

編輯問題稍微複雜一些,因爲我使用C-MEX基礎以後實際讀取數據,而不是hdf5read。此外,這個問題真的hdf5write,這是可見的HDF5文件本身:

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

data      Dataset {10} 

也就是說,該數據被保存爲在HDF5文件中的一維數組。爲了比較,我嘗試使用實際的2-d矩陣(顯示它的樣子),1維列向量,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}而不是數據集{10,1}。

回答

4

這是一個問題的閱讀。從help

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

我affraid爲此,你將不得不用Matlab的低級別HDF5 API。

在Matlab中,低級API可用於例如H5.open(...),H5D.write(...)等。這些名稱完全對應於C庫的名稱(請參閱HDF5 doc)。然而,它們所採用的參數略有不同,但matlab help函數會告訴你一切你需要知道的信息...

好消息是API的Matlab版本仍然不如C版。例如,你不必手動關閉數據類型,數據空間等,因爲當變量超出範圍時,Matlab會爲你關閉它們。

相關問題