2011-06-22 55 views
2

我有一個無格式(我認爲是二進制)數據的.img文件,我想在Matlab中將它讀入浮點數組成四維數組。我注意到,在Matlab中「FREAD」功能用於讀取二進制數據只能自動讀入一維或二維數組,所以我想是這樣的:在Matlab中將未格式化的數據讀入4D數組(012)

function fileArr4D= load4DFile(dim1, dim2, dim3, dim4, filename) 

fileArr4D= zeros(dim1, dim2, dim3, dim4); %initialize array 
fid= fopen(strcat('files/', filename)); 
for l= 1:dim4 
    for k= 1:dim3 
     fileArr4D(:, :, k, dim4)= fread(fid, [dim1, dim2], 'float'); 
    end 
end 
fclose(fid); 
fileArr4D= flipdim(fileArr4D, 2); %flips along dimension 2 (of 4) 

end 

最後一行是翻轉的數據(一些具體的事情到數據),並且我包含它的唯一原因是萬一它是錯誤的來源。

無論如何,這個函數給了我一個4D數組,但沒有我想要的值。其實我翻譯從IDL Matlab的一些代碼,並在IDL,實現如下:

pp=fltarr(dim1,dim2,dim3,dim4) 
file='pathto/filename.img' 
openr,1,file 
readu,1,pp 
pp=reverse(pp,2) 
close,1 

然而,比較由fileArr4D在Matlab與IDL,最小,最大PP返回的數組,而平均數組都是不同的。任何關於在這兩種情況下做什麼不同的想法,或者在Matlab中將二進制數據讀入四維數組的更自然的方法?

順便說一句,如果我切換Matlab函數中的循環順序(f or k= 1:dim3, for l= 1:dim4, ...而不是for l= 1:dim4, for k= 1:dim3, ...),我會得到正確的最小值和最大值但錯誤的平均值(與以前的平均值相同)。

任何幫助將IDL片段的行爲獲取到Matlab將不勝感激。

回答

2

由於您想使用fread來訪問數據,它只能讀取1D或2D數組,我建議將數據加載爲1D數組。一旦將數據作爲一維數組,只要您知道尺寸應該是多少,您可以調用1D陣列上的reshape函數將其重新格式化爲適當大小的四維數組。

+0

工作就像一個魅力,謝謝! – Marvin