我想使用几种不同的方法在数组(EP_G2)中基于.1和.999之间的值在逻辑索引中使用逻辑数组(B) )其中循环2)任何。在Fortran 90基于“查找”的逻辑索引
program flux_3d
implicit none
INTEGER :: RMAX, YMAX, ZMAZ, timesteps
DOUBLE PRECISION, PARAMETER :: pmin=0.1
DOUBLE PRECISION, PARAMETER :: pmax=0.999
INTEGER :: sz
DOUBLE PRECISION, ALLOCATABLE :: EP_G2(:,:), C(:)
INTEGER, DIMENSION(RMAX*ZMAX*YMAX) :: B
LOGICAL, DIMENSION(RMAX*ZMAX*YMAX) :: A
! dimensions of array,
RMAX = 540
YMAX = 204
ZMAX = 54
timesteps = 1
!Open ascii array
OPEN(100, FILE ='EP_G2', form = 'formatted')
ALLOCATE(EP_G2(RMAX*ZMAX*YMAX, timesteps))
READ(100, *) EP_G2
WHERE(pmin<EP_G2(:,timesteps)<pmax) B = 1
ELSEWHERE
B = 0
ENDWHERE
PRINT*, B
! SZ # OF POINTS IN B
sz = count(B.eq.1)
!alternate way of finding points between pmin and pmax
A = ANY(pmin<EP_G2(:,t)<pmax)
print*, sz
!Then use the logical matrix B (or A) to make new array
!Basically I want a new array that isolates just the points in array between
!pmin and pmax
ALLOCATE(C(sz))
C = EP_G2(LOGICAL(B), 1)
我得到的问题是,我要么得到整个数组或没有和命令逻辑的(B)得到一个错误,这是不正确的那种。我是来自Matlab的Fortran的新手,我只用find。 此外,由于此数组超过5,948,640 x 1,所以计算时间是一个问题。我正在使用英特尔Fortran编译器(我相信15.0)。
基本上,我正在寻找最快的方法来查找两个数字之间的数组中的点的索引。
任何帮助将不胜感激。
只是为了澄清问题。你有一个'DOUBLE PRECISION :: EP_G2'的数组。你需要第二个数组'DOUBLE PRECISION :: C',它只包含特定范围内的值。那是对的吗?你还需要将这些数字的索引存储在'EP_G2'中吗? – Jack
是的。我正在寻找将值存储在一个数组中并将索引存储在单独的数组中。 – akimbo