使用 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 |~~~~~~~~~~~~~~~~~~
你的例子中有太多不相关的变量,同时没有给我们正确评估你想要的信息。
如果您只是想检查两个可能大小不等的数组 A
和 B
是否共享至少一个元素,那么您可以使用此构造:
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
在继续执行代码之前,我需要使用 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 |~~~~~~~~~~~~~~~~~~
你的例子中有太多不相关的变量,同时没有给我们正确评估你想要的信息。
如果您只是想检查两个可能大小不等的数组 A
和 B
是否共享至少一个元素,那么您可以使用此构造:
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