Arrays 两个大数组的高效数组索引记忆方法

Arrays 两个大数组的高效数组索引记忆方法,arrays,fortran,Arrays,Fortran,我有两个二维和三维的Fortran数组,比如a(nx,ny)和b(nx,ny,nz)。在数组a中,我需要找出满足的点,比如值>0。然后我需要定位数组b中的向量,这些向量的x和y的索引与a中满足的点相同。最简单快捷的方法是什么?这两个数组很大,我不想一个元素一个元素地搜索。希望我能把我的问题解释清楚!谢谢 我不确定这是否是最好的方法,但以下是我要做的: 在z值上的do循环中放置where子句。如果不希望每次都重新计算点,可以首先将有效索引的2D映射获取到逻辑数组中: program indices

我有两个二维和三维的Fortran数组,比如a(nx,ny)和b(nx,ny,nz)。在数组a中,我需要找出满足的点,比如值>0。然后我需要定位数组b中的向量,这些向量的x和y的索引与a中满足的点相同。最简单快捷的方法是什么?这两个数组很大,我不想一个元素一个元素地搜索。希望我能把我的问题解释清楚!谢谢

我不确定这是否是最好的方法,但以下是我要做的:

在z值上的
do
循环中放置
where
子句。如果不希望每次都重新计算点,可以首先将有效索引的2D映射获取到逻辑数组中:

program indices
    implicit none
    integer, parameter :: nx = 3000, ny = 400, nz = 500
    integer, dimension(nx, ny) :: a
    integer, dimension(nx, ny, nz) :: b
    logical, dimension(nx, ny) :: valid_points

    integer :: x, y, z

    do y = 1, ny
        do x = 1, nx
            a(x, y) = x - y
        end do
    end do

    valid_points = (a > 0)

    do z = 1, nz
        where(valid_points)
            b(:, :, z) = z
        else where
            b(:, :, z) = 0
        end where
    end do

end program indices

我不确定这是否是最好的方法,但我会这样做:

在z值上的
do
循环中放置
where
子句。如果不希望每次都重新计算点,可以首先将有效索引的2D映射获取到逻辑数组中:

program indices
    implicit none
    integer, parameter :: nx = 3000, ny = 400, nz = 500
    integer, dimension(nx, ny) :: a
    integer, dimension(nx, ny, nz) :: b
    logical, dimension(nx, ny) :: valid_points

    integer :: x, y, z

    do y = 1, ny
        do x = 1, nx
            a(x, y) = x - y
        end do
    end do

    valid_points = (a > 0)

    do z = 1, nz
        where(valid_points)
            b(:, :, z) = z
        else where
            b(:, :, z) = 0
        end where
    end do

end program indices

没有信誉将fortran标记放在已经存在的标记上。您不应该需要任何特殊的声誉级别来将其用于您自己的问题。您也不需要任何声誉来编辑自己的问题,因此您应该能够添加它。您需要知道所有索引,还是只需要在这些索引中对B执行一些操作?没有声誉来放置fortran标记是一个已经存在的标记。您不应该需要任何特殊的声誉级别来将其用于您自己的问题。你也不需要任何声誉来编辑你自己的问题,所以你应该能够添加它。你需要知道所有的索引,或者你只需要在这些索引上对B做一些操作吗?对于小数组来说可以。测试真实案例。谢谢!不要使用临时逻辑数组,这是多余的,编译器可以轻松地处理
where
语句内联,而无需额外内存。对于小数组,工作正常。测试真实案例。谢谢!不要使用临时逻辑数组,这是多余的,编译器可以轻松地处理
where
语句,而无需额外内存。