矩阵乘法程序:错误:无法分类的语句在(1)处。

5

我是一个很新的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行无法分类的语句


1
你需要像这里 http://stackoverflow.com/q/28049298/3157076 中那样将 subC 中的参数声明为数组。 - francescalus
2
其他问题,C被使用而没有初始化。C=..语句是对整个数组的赋值,语法上是有效的,但肯定不是您想要的。 - agentp
@Marcus,你的编辑有什么意义?在编辑中,你不应该纠正编码错误,如果它是实质性的,那么它可能是一个答案的基础,否则就是一个评论。如果你想让代码与错误消息兼容,你也没有成功,我不确定有没有办法在不改变太多的情况下做到这一点。 - Vladimir F Героям слава
2个回答

5
正如francescalus在评论中所述,ABC在子程序中被声明为标量变量。因此,您无法将它们作为数组进行索引。
在这种特定情况下,我更倾向于使用内置函数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


2

虽然更像是格式化的注释而非答案,但这是声明。

Real, Dimension (2:2) :: A,B,C

声明ABC为0元素的一级数组。你可能需要重写该语句。
Real, Dimension (2,2) :: A,B,C

该语句声明了数组为二维的 2x2 数组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接