在fortran中使用带有矩阵的IF语句

时间:2015-07-21 06:52:10

标签: matrix fortran

我想通过一个矩阵并检查它的任何块是否与预定义的单位相同。这是我的代码。 'sd5'是2乘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)

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

1 个答案:

答案 0 :(得分:5)

首先,如果语句需要标量子句。

(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。