2015-08-17 94 views
0

任何人都可以修改我的代碼或向我展示如何創建一個「可以訪問的一維數組」嗎?目前,我無法訪問1D數組中的每個元素。FORTRAN:2D到1D

代碼:


     MODULE PARAMETERS 
     INTEGER :: FILE 
     INTEGER :: X=3,Y=3,Z=9 
     INTEGER :: I, J, K, L = 1 
     INTEGER :: B(9) 
     INTEGER :: A(3,3) 
     DATA  A/ 1,2,3,4,5,6,7,8,9/ 
     END MODULE PARAMETERS

PROGRAM CLUSTER USE PARAMETERS IMPLICIT NONE OPEN(UNIT=11,FILE="2D.TXT",ACTION="WRITE") DO J = 1,Y DO I = 1,X B(L) = A(I,J) WRITE(11,*) , B(L) END DO L = L + 1 END DO CLOSE(11) END PROGRAM CLUSTER
+1

用途你是什​​麼意思:「可以訪問的一維數組」? – innoSPG

+0

是的,謝謝! –

+0

你想做什麼? – casey

回答

1

如果你只是試圖把你的二維數組轉換成一維數組,使用reshape內在。相當於你的自我的答案代碼:

PROGRAM CLUSTER 
    USE PARAMETERS 
    IMPLICIT NONE 
    OPEN(UNIT=11,FILE="2D.TXT",ACTION="WRITE") 
    B = reshape(A, [ 9 ]) 
    write (11,'(i8)'), (b(i),i=1,9) 
    CLOSE(11) 
    END PROGRAM CLUSTER 

正如在評論你的答案,你的問題都指出,這種整形可能是不必要的你與MPI,在那裏你可以直接使用A.

+0

謝謝凱西。我剛剛開始重寫我的mpi代碼,手指交叉 –

1

我固定它,這是主要的程序應該是這樣......


PROGRAM CLUSTER 
USE PARAMETERS 
IMPLICIT NONE 
OPEN(UNIT=11,FILE="2D.TXT",ACTION="WRITE") 
    L = 1 
    IF (L .LT. 10) THEN 
    DO J = 1,Y 
     DO I = 1,X 
      B(L) = A(I,J) 
      WRITE(11,*) , B(L) 
      L = L + 1 
     END DO 
    END DO 
    ELSE 
    WRITE(11,*), "NOTHING TO DO HERE" 
    END IF 
CLOSE(11) 
END PROGRAM CLUSTER 
+0

請注意,你很少需要這樣的數據重新排列。對於大型數組(特別是多維),嵌套循環會帶來相當的開銷(而MPI操作本身已經有開銷)。如果你真的需要將你的數據轉換爲1D,你應該使用fortran95中引入的'reshape()'。 –

+0

我確實看着重塑(),但我使用f90。 –

+0

@SathyaAnantharajah'reshape'仍然在Fortran中是最新的標準(Fortran 2008),並且不被棄用... – casey