使用 Fortran IF 构造查找两个数组之间的匹配值

Using Fortran IF construct to find matching values between two arrays

在继续执行代码之前,我需要使用 IF 条件来确定数组 (A) 中的整数是否与另一个数组 (B) 中的整数匹配.这些数组的长度不等,并且包含唯一的值,这些值都是正数。

我知道我可以使用以下方法找到匹配值:

DO I = 1,SIZE(A)
Match(J)=(ANY(A(I)==B))

但是 IF...THEN 结构不接受这种格式。我还没有找到一种方法来实现它看起来在线和一般测试。我在这里错过了什么?

编辑: 作为替代方案,我尝试了以下代码:

   INTEGER :: I , K, B(900),C(900),I1,ID3, IP
   INTEGER, INTENT(IN)           :: A, N

       OPEN(12,FILE='../B.dat')
       DO I=1,817
          READ(12,*)B(I),C(I)
       END DO

       DO I = 1,SIZE(A)
        DO K = 1,SIZE(B)
         IF (I.EQ.K) THEN
             DO IP = N-9,N
                ID3 = I1 +A*(IP-1)
         END DO
         END DO
         END DO

然而,K 在整个循环中不断变化,因此代码无法进行匹配。然后我尝试了:

DO I = 1, SIZE(A)
  I1 =ID(I)
    DO IP = N-9,N
      ID3 = I1 +A*(IP-1)
    END DO

但是我收到了一个分段错误:

_____________ runcode::main: : |runCode: Fail to run |C:\TELEMAC\VEG\May\PRIVEtest.cas_2018-05-02-16h57min04s\out_testMedit.exe |~~~~~~~~~~~~~~~~~~ |Program received signal SIGSEGV: Segmentation fault - invalid memory referen ce. | |Backtrace for this error: |#0 ffffffffffffffff |~~~~~~~~~~~~~~~~~~

你的例子中有太多不相关的变量,同时没有给我们正确评估你想要的信息。

如果您只是想检查两个可能大小不等的数组 AB 是否共享至少一个元素,那么您可以使用此构造:

any([(any(A(i) == B), i = 1, size(A))])

让我们进入细节:

any(A(i) == B)

这将检查 A 的第 i 个元素是否在 B 中的任何位置。 Returns 合乎逻辑。然后我为 A:

的所有元素创建一个临时数组
[(any(A(i) == B), i = 1, size(A))]

然后在其周围放置一个 any(),您完全可以在 IF 语句中使用它:

program my_any

    implicit none
    integer :: A(3), B(4), i

    A = [1, 2, 3]
    B = [6, 3, 4, 10]

    if (any([(any(A(i) == B), i=1, size(A))])) then
        print *, "YES"
    else
        print *, "NO"
    end if

end program my_any