2015-08-17 63 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