在 Fortran 中查找两个数组的交集
Finding the intersect of two arrays in Fortran
我正在尝试在 Fortran 中生成两个一维数组的交集。
目的是在 maxloc
中使用这个交集作为掩码,这样我就可以将一个数组中的最大元素拉到另一个数组中(类似于最大堆中重复根删除的行为)。
目前,在将 maxloc
找到的索引处的值插入第二个数组后,我只是将该索引处的值设置为零,但我希望 Fortran 对此有一个巧妙的掩码相关方法。 (在这个最大检索过程中保持原始数组不变也很好)
我不太清楚你的意思。如果你想逐个索引地比较两个数组,你可以只使用 ==
,像这样:
INTEGER :: a(4), b(4)
LOGICAL :: inter(4)
a = (/ 1, 2, 3, 4 /)
b = (/ 4, 2, 3, 1 /)
inter = (a == b) ! (/ F, T, T, F /)
这在技术上不是交集,但 MAXLOC
中的 MASK
需要是 LOGICAL
的数组,所以我假设这就是你想要的。
如果你想测试a
的值是否在b
中的任何地方,你必须至少使用一个DO
循环,我认为:
DO j = 1, size(a)
inter(j) = any(a(j) == b)
END DO
如果你想找到最大的,比如说,n 个值,你可以使用这样的东西:
function largest(vars, n)
implicit none
integer, intent(in) :: n
real, dimension(:), intent(in) :: vars
real, dimension(n) :: largest
integer :: i
logical, dimension(size(vars)) :: m
integer :: mloc
m = .TRUE.
do i = 1, n
mloc = maxloc(vars, DIM=1, MASK=m)
m(mloc) = .FALSE.
largest(i) = vars(mloc)
end do
return
end function largest
基本上它使用一个全为真的掩码,然后每次它将最高的掩码恢复为假,以便在下一次迭代中不再获得该值。
当然,这是有序的(n*size(var)),所以如果n很大,那么做冒泡排序可能会更快,直到最后累积n个最大值,然后捡起来。
我正在尝试在 Fortran 中生成两个一维数组的交集。
目的是在 maxloc
中使用这个交集作为掩码,这样我就可以将一个数组中的最大元素拉到另一个数组中(类似于最大堆中重复根删除的行为)。
目前,在将 maxloc
找到的索引处的值插入第二个数组后,我只是将该索引处的值设置为零,但我希望 Fortran 对此有一个巧妙的掩码相关方法。 (在这个最大检索过程中保持原始数组不变也很好)
我不太清楚你的意思。如果你想逐个索引地比较两个数组,你可以只使用 ==
,像这样:
INTEGER :: a(4), b(4)
LOGICAL :: inter(4)
a = (/ 1, 2, 3, 4 /)
b = (/ 4, 2, 3, 1 /)
inter = (a == b) ! (/ F, T, T, F /)
这在技术上不是交集,但 MAXLOC
中的 MASK
需要是 LOGICAL
的数组,所以我假设这就是你想要的。
如果你想测试a
的值是否在b
中的任何地方,你必须至少使用一个DO
循环,我认为:
DO j = 1, size(a)
inter(j) = any(a(j) == b)
END DO
如果你想找到最大的,比如说,n 个值,你可以使用这样的东西:
function largest(vars, n)
implicit none
integer, intent(in) :: n
real, dimension(:), intent(in) :: vars
real, dimension(n) :: largest
integer :: i
logical, dimension(size(vars)) :: m
integer :: mloc
m = .TRUE.
do i = 1, n
mloc = maxloc(vars, DIM=1, MASK=m)
m(mloc) = .FALSE.
largest(i) = vars(mloc)
end do
return
end function largest
基本上它使用一个全为真的掩码,然后每次它将最高的掩码恢复为假,以便在下一次迭代中不再获得该值。
当然,这是有序的(n*size(var)),所以如果n很大,那么做冒泡排序可能会更快,直到最后累积n个最大值,然后捡起来。