【问题标题】:Matrix multiplication program: Error: Unclassifiable statement at (1)矩阵乘法程序:错误:(1) 处的不可分类语句
【发布时间】:2015-01-24 11:18:35
【问题描述】:

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

【问题讨论】:

  • 您需要将subC 中的参数声明为数组,就像在stackoverflow.com/q/28049298/3157076 中一样。
  • 其他问题,C 使用未初始化。 C=.. 语句是对整个数组的赋值,在语法上是有效的,但肯定不是你想要的
  • @Marcus 您编辑的目的是什么?您不应该纠正编辑中的编码错误,如果它是实质性的,它可能是一个答案的基础,否则是一个评论。如果您想让代码与错误消息兼容,那么您也没有成功,我不确定是否有一种方法可以在不进行太多更改的情况下做到这一点。

标签: fortran fortran90 matrix-multiplication


【解决方案1】:

正如 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
    

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

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

    将数组声明为 rank-2 和 2x2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多