Fortran 中的矩阵生成
Matrix generation in Fortran
问题:我需要生成一个 M*N 矩阵,其中 M 代表行,N 代表列。
该矩阵的元素应类似于 (i-1.0)*N+j。
此代码不起作用,我不明白为什么。
我使用 Compaq Visual Fortran 6.
我除了这段代码必须生成一个矩阵。生成后矩阵应该打印成
1.0 2.0 3.0
4.0 5.0 6.0
对于3*2矩阵。
现在这段代码根本不起作用,向我展示了一堆 Windows 执行错误。
INTEGER M, N, I, J
COMMON /BLK1/ MATA (256, 256)
READ (7, 100) M
READ (7, 100) N
100 FORMAT (I3)
CALL MATGEN (M, N)
DO 90003 I = 1, M
DO 90004 J = 1, N
WRITE (8, 101) MATA(I, J)
101 FORMAT (F8.1, ' ', \)
90004 CONTINUE
WRITE (8, 102)
102 FORMAT (/, /)
90003 CONTINUE
END
SUBROUTINE MATGEN (M, N)
REAL DUM
INTEGER I, J
COMMON /BLK1/ MATA (256, 256)
DUM = 1.0
DO 90001 I = 1, M
DO 90002 J = 1, N
MATA (I, J) = DUM + 1.0
90002 CONTINUE
90001 CONTINUE
RETURN
END
COMMON BLK1
REAL MATA (256, 256)
END
您的代码有几个问题:
- 程序没有真正启动(在下面的代码中是
PROGRAM TEST
)
MATA
是(隐含地)整数。我添加了声明。以后请用IMPLICIT NONE
!
- 末尾有一些不属于那里的奇怪代码...
- 正如 francescalus 指出的那样,赋值没有递增,因此
MATA
被 2
填充。
- 我的
gfortran
版本不接受反斜杠来禁止换行。我不得不使用 $
。有关详细信息,请参阅 here。
- Agentp 表示您没有打开第七单元进行输入。我将该行改为从
STDIN
读取。
- 缩进不疼!
PROGRAM TEST
IMPLICIT NONE
INTEGER M, N, I, J
REAL MATA
COMMON /BLK1/ MATA(256, 256)
WRITE(*,*) 'Please enter M:'
READ (*, 100) M
WRITE(*,*) 'Please enter N:'
READ (*, 100) N
100 FORMAT (I3)
CALL MATGEN (M, N)
DO 90003 I = 1, M
DO 90004 J = 1, N
WRITE (8, 101) MATA(I, J)
101 FORMAT (F8.1, ' ', $)
90004 CONTINUE
WRITE (8, 102)
102 FORMAT (/, /)
90003 CONTINUE
END
SUBROUTINE MATGEN (M, N)
IMPLICIT NONE
INTEGER M, N
REAL DUM
INTEGER I, J
REAL MATA
COMMON /BLK1/ MATA(256, 256)
DUM = 0.0
DO 90001 I = 1, M
DO 90002 J = 1, N
DUM = DUM + 1.
MATA (I, J) = DUM
90002 CONTINUE
90001 CONTINUE
RETURN
END
这导致:
$ ./a.out
Please enter M:
2
Please enter N:
3
$ cat fort.8
1.0 2.0 3.0
4.0 5.0 6.0
问题:我需要生成一个 M*N 矩阵,其中 M 代表行,N 代表列。 该矩阵的元素应类似于 (i-1.0)*N+j。 此代码不起作用,我不明白为什么。 我使用 Compaq Visual Fortran 6.
我除了这段代码必须生成一个矩阵。生成后矩阵应该打印成
1.0 2.0 3.0
4.0 5.0 6.0
对于3*2矩阵。
现在这段代码根本不起作用,向我展示了一堆 Windows 执行错误。
INTEGER M, N, I, J
COMMON /BLK1/ MATA (256, 256)
READ (7, 100) M
READ (7, 100) N
100 FORMAT (I3)
CALL MATGEN (M, N)
DO 90003 I = 1, M
DO 90004 J = 1, N
WRITE (8, 101) MATA(I, J)
101 FORMAT (F8.1, ' ', \)
90004 CONTINUE
WRITE (8, 102)
102 FORMAT (/, /)
90003 CONTINUE
END
SUBROUTINE MATGEN (M, N)
REAL DUM
INTEGER I, J
COMMON /BLK1/ MATA (256, 256)
DUM = 1.0
DO 90001 I = 1, M
DO 90002 J = 1, N
MATA (I, J) = DUM + 1.0
90002 CONTINUE
90001 CONTINUE
RETURN
END
COMMON BLK1
REAL MATA (256, 256)
END
您的代码有几个问题:
- 程序没有真正启动(在下面的代码中是
PROGRAM TEST
) MATA
是(隐含地)整数。我添加了声明。以后请用IMPLICIT NONE
!- 末尾有一些不属于那里的奇怪代码...
- 正如 francescalus 指出的那样,赋值没有递增,因此
MATA
被2
填充。 - 我的
gfortran
版本不接受反斜杠来禁止换行。我不得不使用$
。有关详细信息,请参阅 here。 - Agentp 表示您没有打开第七单元进行输入。我将该行改为从
STDIN
读取。 - 缩进不疼!
PROGRAM TEST
IMPLICIT NONE
INTEGER M, N, I, J
REAL MATA
COMMON /BLK1/ MATA(256, 256)
WRITE(*,*) 'Please enter M:'
READ (*, 100) M
WRITE(*,*) 'Please enter N:'
READ (*, 100) N
100 FORMAT (I3)
CALL MATGEN (M, N)
DO 90003 I = 1, M
DO 90004 J = 1, N
WRITE (8, 101) MATA(I, J)
101 FORMAT (F8.1, ' ', $)
90004 CONTINUE
WRITE (8, 102)
102 FORMAT (/, /)
90003 CONTINUE
END
SUBROUTINE MATGEN (M, N)
IMPLICIT NONE
INTEGER M, N
REAL DUM
INTEGER I, J
REAL MATA
COMMON /BLK1/ MATA(256, 256)
DUM = 0.0
DO 90001 I = 1, M
DO 90002 J = 1, N
DUM = DUM + 1.
MATA (I, J) = DUM
90002 CONTINUE
90001 CONTINUE
RETURN
END
这导致:
$ ./a.out
Please enter M:
2
Please enter N:
3
$ cat fort.8
1.0 2.0 3.0
4.0 5.0 6.0