回 帖 发 新 帖 刷新版面

主题:把一维数组变为二维 fortran

比如 A(8)  如何变为(4,2)呢

回复列表 (共3个回复)

沙发

那取决于到底怎么变
反正不管怎么变,循环都可实现

板凳

如果用内部函数的话可以使用reshape来实现. 方法可以直接翻翻书后面的内部函数或者看看fortran编译器的帮助.

3 楼

给你个参考吧:
将A1(3,2):
  0.100000000000000       0.400000000000000     
  0.200000000000000       0.500000000000000     
  0.300000000000000       0.600000000000000
变成A2(6):
  0.100000000000000     
  0.200000000000000     
  0.300000000000000
  0.400000000000000
  0.500000000000000
  0.600000000000000
可以使用这个子程序:
SUBROUTINE A_MNT1J(LN1,COL1,LN2,ARRAY1,ARRAY2)
  IMPLICIT NONE
  INTEGER,INTENT(IN) :: LN1,COL1,LN2
  REAL(KIND=8),INTENT(IN) :: ARRAY1(LN1,COL1)
  REAL(KIND=8),INTENT(OUT) :: ARRAY2(LN2)
  INTEGER :: I,J,K,D,DD
  D = 0
  DD = LN1
  DO J = 1,COL1
    DO I = 1,LN1
      ARRAY2(I + D)=ARRAY1(I,J)
    ENDDO
    D = D + DD
  ENDDO
  RETURN
END SUBROUTINE A_MNT1J

反过来 将A2变成A1 可以使用:
SUBROUTINE A_1TMNJ(LN1,LN2,COL2,ARRAY1,ARRAY2)
  IMPLICIT NONE
  INTEGER,INTENT(IN) :: LN1,LN2,COL2
  REAL(KIND=8),INTENT(IN) :: ARRAY1(LN1)
  REAL(KIND=8),INTENT(OUT) :: ARRAY2(LN2,COL2)
  INTEGER :: I,J,K,D,DD
  D = 0
  DD = LN2
  DO J = 1,COL2
    DO I = 1,LN2
      ARRAY2(I,J) = ARRAY1(I + D)
    ENDDO
    D = D + DD
  ENDDO
  RETURN
END SUBROUTINE A_1TMNJ

我来回复

您尚未登录,请登录后再回复。点此登录或注册