2012-11-27 39 views
1

我剛纔寫了一個文件:在matlab中讀取未格式化的Fortran文件 - 哪個精度?

real*8       :: vol_cel 
real*8, dimension(256,256,256) :: dense 

[... some operations] 

open(unit=8,file=fname,form="unformatted") 
write(8)dense(:,:,:)/vol_cell 
close(8) 

我的代碼在Matlab閱讀本在:

fid = fopen(fname,'r'); 
mesh_raw = fread(fid,256*256*256,'double'); 
fclose(fid); 

的最小值和最大值清楚地表明,它不是在正確的閱讀它(最小是0和max是一個大實正數* 8)。

min = 
    3.3622e+38 
max = 
    -3.3661e+38 

我需要在Matlab中設置什麼精度才能使其在未格式化的Fortran文件中讀取?

一個有點相關的問題:我使用的這個Matlab代碼讀取二進制文件,但沒有格式化文件。儘管我使用gfortran在我的Mac OSX上生成了這些新數據。它不識別form =「binary」,所以我不能這樣做。我需要添加一些庫還是這個endian問題?

=====進展=====

好的進展。相反,我NDIM * NDIM * NDIM矩陣的我剛寫出來的x值(列向量)這樣:

open(unit=8,file=fnamex,form="unformatted") 
write(8)x0 
close(8) 

然後Matlab的讀取:

fid = fopen(nfilename,'r'); 
hr3=fread(fid, 1, 'int32'); 
x0 = fread(fid,Ntot,'float32'); 
hr4=fread(fid, 1, 'int32'); 
fclose(fid); 

奏效。然後我嘗試了原始的ndim ** 3矩陣,我嘗試閱讀:

fid = fopen(nfilename,'r'); 
hr3=fread(fid, 1, 'int32'); 
mesh_raw = fread(fid,ndim*ndim*ndim,'float32'); 
hr4=fread(fid, 1, 'int32'); 
fclose(fid); 

但是,這給了我垃圾。也許在這裏:

real*4,  dimension(:), allocatable :: x0 
real*8,  dimension(256,256,256)   :: dense 

我需要改變:mesh_raw = FREAD(FID,NDIM * NDIM * NDIM, 'FLOAT32');以確保它正在閱讀一個真正的* 8?那會是什麼?當然只是使用'真實* 8'的逐字記錄應該工作?我的意思是'真正* 4'的X矢量作品。我的意思是它讀取「密集」,但最小/最大/平均值是錯誤的。

+0

「UINT32」可能是解決辦法... – Griff

回答

1

你的Fortran代碼顯示你寫的東西被稱爲未格式化的順序文件。這是基於記錄的文件格式。典型實現(Fortran編譯器/特定於平臺)用於編譯器向文件寫入添加記錄結構信息 - 通常(包括gfortran)記錄長度寫在每條記錄的開始和結尾處。您的原始Matlab代碼似乎沒有考慮到這一點。

Fortran 2003引入了流訪問(在OPEN語句中添加了ACCESS='STREAM'說明符)。 gfortran支持這個功能,FORM ='BINARY'是一些編譯器上的非標準同義詞。使用流訪問創建的未格式化文件沒有記錄結構 - 它是類似於C流的字節流。這可能對你更合適。

+0

我的代碼編譯我的MacBook但後來當我嘗試編譯它在與相同版本的gfortran的集羣失敗的一個基本的讀聲明 - 如果相同的代碼編譯一臺機器上,而不是另一種,這是它始終是硬件 – Griff

+0

號,您將需要一個新的問題,提供額外的信息(也許? ),以允許用戶在這裏做出有用的評論。 – IanH

1

這很可能是一個endian問題,因爲粗略的有序猜測會給我一個更合理的數字。我不確定解決方案的可行性,所以我會給你3個可能的解決方案,其中一個解決問題。這取決於你的源文件。

訣竅很簡單,就是在fopen聲明更改爲以下之一:

fid = fopen(fname,'rn'); %Native format (Default usually) 
fid = fopen(fname,'rl'); %Little Endian 
fid = fopen(fname,'rb'); %Big Endian 
+0

無遺憾的是,沒有工作。不是他們的頭和尾項的Fortran時寫出未格式化的文件?我仍然不知道如何閱讀這個文件。翻轉尾段時:( – Griff

+0

結果是什麼? – PearsonArtPhoto

+0

我加了一些進展,如上面的編輯。問題仍然NDIM * NDIM * NDIM矩陣讀書。 – Griff

0
fid = fopen(nfilename,'r'); 
hr3=fread(fid, 1, 'int32'); 
mesh_raw = fread(fid,ndim*ndim*ndim,'float32'); 
hr4=fread(fid, 1, 'int32'); 
fclose(fid); 

這是正確的,只是因爲你是在FORTRAN寫實時* 8,你需要有

mesh_raw = fread(fid,ndim*ndim*ndim,'double'); 
+0

這是從問題(最先Matlab代碼)的原代碼,它應該是怎樣幫助? –

相關問題