矩阵乘法程序:错误:(1)处的不可分类陈述

时间:2015-01-24 11:18:36

标签: fortran fortran90 matrix-multiplication

我是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)

的不可分类陈述

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

更多格式化的评论而非答案但声明

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

ABC声明为0个元素的rank-1数组。您可能应该将语句重写为

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

声明数组为rank-2和2x2