2014-09-25 99 views
0

比方說,我有一個5×5陣列的浮動點的文件array.txt成不同大小的Fortran數組

1.0 1.1 0.0 0.0 0.0 
1.2 1.3 1.4 0.0 0.0 
0.0 1.5 1.6 1.7 0.0 
0.0 0.0 1.8 1.9 1.0 
0.0 0.0 0.0 1.1 1.2 

我知道這可能是做一個奇怪的東西,但我我只是想更好地學習read聲明:我想要在Fortran中創建兩個3x3陣列,即real, dimension(3,3) :: array1, array2並嘗試將前9個值逐行讀入array1以及將以下9個值讀入array2。也就是說,我想陣列的形式爲

array1 = 1.0 1.1 0.0 
     0.0 0.0 1.2 
     1.3 1.4 0.0 

array2 = 0.0 0.0 1.5 
     1.6 1.7 0.0 
     0.0 0.0 1.8 

下一步我想嘗試按列做同樣的:

array1 = 1.0 1.2 0.0 
     0.0 0.0 1.1 
     1.3 1.5 0.0 

array2 = 0.0 0.0 1.4 
     1.6 1.8 0.0 
     0.0 0.0 1.7 

我的「最接近」的嘗試逐行:

program scratch 
    implicit none 

    real, dimension(3,3) :: array1, array2 
    integer :: i 

    open(12, file="array.txt") 

!read in values             
    do i = 1,3 
     read(12,'(3F4.1)', advance="no") array1(i,:) 
    end do 

end program scratch 

我的問題:

答:如何在最後進入下一條記錄?

B.如何以列方式進行讀取?

C.爲什麼需要'(3F4.1)',而不是'(3F3.1)'?因爲「按列分配」我會建議在閱讀整個作品爲5x5的陣列的要求

回答

0

real tmp(5,5) 
read(unit,*)tmp 

(注意無需格式規範)

然後做你需要的任務使用數組操作。

這個小陣,做最簡單的事情似乎是:

real tmp(5,5),flat(25),array1(3,3),array2(3,3) 
read(unit,*)tmp 
flat=reshape(tmp,shape(flat)) 
array1=reshape(flat(:9),shape(array1)) 
array2=reshape(flat(10:18),shape(array2)) 

然後轉置版本很簡單:

flat=reshape(transpose(tmp),shape(flat)) 
array1=reshape(flat(:9),shape(array1)) 
array2=reshape(flat(10:18),shape(array2)) 

如果這是一個非常大的陣列我會想避免製作額外的數據副本。

請注意,如果需要根據 ,您可以在transpose中包裝這些分配中的每一個,例如,如何確實表示數據。

 array1=transpose(reshape(flat(:9),shape(array1))) 
0

逐行讀取很簡單:

READ(12,*) ((array1(i,j),j=1,3),i=1,3),((array2(i,j),j=1,3),i=1,3) 

「提前=‘不’」是僅當您使用2個讀語句而不是1(且僅在第一次讀取)。但這隻適用於明確的格式...

按列讀文件並不那麼明顯,尤其是因爲讀文件通常是一項昂貴的任務。我建議你在更大的表格中讀取文件,然後將值分配到兩個數組中。例如:

real :: table(5,5) 
integer :: i,j,ii,jj,k 
.. 
read(12,*) ((table(i,j),j=1,5),i=1,5) 
k=0 
do j=1,3 
    do i=1,3 
     k=k+1 
     jj=(k-1)/5+1 
     ii=k-(jj-1)*5 
     array1(i,j)=table(ii,jj) 
    enddo 
enddo 
do j=1,3 
    do i=1,3 
     k=k+1 
     jj=(k-1)/5+1 
     ii=k-(jj-1)*5 
     array2(i,j)=table(ii,jj) 
    enddo 
enddo 

(3F4.1)比(3F3.1)更好,因爲每個數字佔據事實上(3爲數字和1號之間的空間)的4個字節。但正如你所看到的,我已經使用*來避免考慮這種細節。

相關問題