【问题标题】:Use of IF statement with matrices in fortran在 fortran 中使用带有矩阵的 IF 语句
【发布时间】:2015-07-21 06:52:10
【问题描述】:

我想通过一个矩阵并检查它的任何块是否与预定义的单元相同。这是我的代码。 'sd5' 是 2 x 2 的预定义单位。

ALLOCATE (fList((n-1)**2,3))
fList = 0
p = 1
DO i = 1, n-1, 1
  DO j = 1, n-1, 1
    IF (TEST(i:i+1, j:j+1) == sd5) THEN
      fList(p,1:3) = (i, j+1, 101) ! 101 should be replaced by submatrix number
  END IF
  p = p+1
  END DO
END DO

问题似乎出在IF 语句中,因为TEST(i:i+1, j:j+1) == sd5 中返回了四个逻辑语句。我收到此错误:

Error: IF clause at (1) requires a scalar LOGICAL expression

我收到另一个错误:

fList(p,1:3) = (i, j+1, 101) ! 101 should be replaced by sub matrix number
     1
Error: Expected PARAMETER symbol in complex constant at (1)

我不明白这个错误,因为所有变量都是我定义的整数。

【问题讨论】:

    标签: matrix fortran


    【解决方案1】:

    首先,if 语句需要 标量 子句。

    (TEST(i:i+1, j:j+1) == sd5)
    

    产生一个包含.true..false. 的2x2 矩阵。由于您要检查 所有 个条目,因此该语句应为

    IF ( all( TEST(i:i+1, j:j+1) == sd5) ) THEN
    

    [如果只有一个匹配条目就足够了,您也可以使用any。 ]

    第二个陈述有点棘手,因为您没有说明您想要实现的目标。事实上,这不是你所期望的。我的猜测是你正在尝试存储一个长度为 3 的向量,并且赋值应该是

    fList(p,1:3) = (/ i, j+1, 101 /)
    

    fList(p,1:3) = [ i, j+1, 101 ]
    

    您提供的语法实际上用于指定复杂的常量:

    ( Real, Imag )
    

    在这种形式中,RealImag 本身需要是常量或文字,参见。 Fortran 2008 标准,R417。

    【讨论】:

    • 太好了,它现在可以编译了!谢谢亚历山大·沃格特!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 2023-02-15
    • 2014-03-02
    相关资源
    最近更新 更多