gpt4 book ai didi

arrays - 在 Fortran 中查找两个数组的交集

转载 作者:行者123 更新时间:2023-12-02 04:44:47 25 4
gpt4 key购买 nike

我正在尝试在 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

基本上,它使用全为 true 的掩码,然后每次将最高掩码恢复为 false,以便在下一次迭代中不再获得该值。

当然,这是有顺序的(n*size(var)),所以如果n很大,进行冒泡排序可能会更快,直到最后积累了n个最大的值,然后挑选它们向上。

关于arrays - 在 Fortran 中查找两个数组的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30247927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com