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

问题描述 投票:5回答:2

我是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)处的不可分类陈述

fortran fortran90 matrix-multiplication
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元素的rank-1数组。您可能应该将该语句重写为

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

声明数组为rank-2和2x2

© www.soinside.com 2019 - 2024. All rights reserved.