Riv*_*ver 2 arrays fortran fortran90 set-intersection fortran95
我正在尝试在Fortran中生成两个1-D数组的交叉.
目的是使用此交集作为掩码,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 /)
Run Code Online (Sandbox Code Playgroud)
这在技术上不是一个交集,但是MASKin MAXLOC需要是一个数组LOGICAL,所以我认为这就是你想要的.
如果你想测试一个值是否在a任何地方b,你必须使用至少一个DO循环,我想:
DO j = 1, size(a)
inter(j) = any(a(j) == b)
END DO
Run Code Online (Sandbox Code Playgroud)
如果你想找到最大的,比方说,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
Run Code Online (Sandbox Code Playgroud)
基本上它使用一个全部为真的掩码,然后每次将掩码恢复为最高为false,以便在下一次迭代中不再获取该值.
当然,这是有序的(n*size(var)),所以如果n很大,可能会更快进行冒泡排序,直到你在最后累积了n个最大值,然后将它们拿起来.