我是Fortran 90的新用户。我正在学习如何编程。目前,我正在尝试创建一个程序来进行矩阵乘法。但是,我收到了一个错误。
Program Matrix_Multiplication
Implicit None
Real, Dimension(2:2) :: A, B, C
Integer :: i, j, k
A = 0.0
B = 0.0
C = 0.0
do i = 1, 2
do j = 1, 2
Read (80, *) A
Read (90, *) B
Write (100, *) A, B
end do
end do
Call subC(A, B, C)
Write (110, *) C
End Program Matrix_Multiplication
Subroutine subC(A, B, C)
Implicit None
Real, Intent(IN) :: A, B
Integer :: i, j, k
Real, Intent(OUT) :: C
do i = 1, 2
do j = 1, 2
C = C(i, j) + (A(i, j)*B(j, i))
end do
end do
return
End Subroutine
编译时:
C(i,j)=(A(i,k)* B(k,j))1错误:(1)
的不可分类陈述
答案 0 :(得分:5)
正如francescalus在他的评论中所述,A
,B
和C
在子程序中被声明为标量。因此,您不能将它们编入索引作为数组。
在这种特殊情况下,我宁愿使用内在函数matmul
而不是编写自己的矩阵 - 矩阵乘法:
Program Matrix_Multiplication
Implicit None
Real, Dimension (2,2) :: A,B,C
A=0.0
B=0.0
C=0.0
do i=1,2
do j=1,2
Read (80,*) A(j,i)
Read (90,*) B(j,i)
Write (100,*) A,B
end do
end do
C = matmul(A,B)
Write (110,*) C
End Program Matrix_Multiplication
对于较大的矩阵,那里有高度优化的数学库。强烈建议使用BLAS / LAPACK。您的示例的正确子例程将是SGEMM。
答案 1 :(得分:2)
更多格式化的评论而非答案但声明
Real, Dimension (2:2) :: A,B,C
将A
,B
和C
声明为0个元素的rank-1数组。您可能应该将语句重写为
Real, Dimension (2,2) :: A,B,C
声明数组为rank-2和2x2
。