我有一个目录,我需要在数组中对其值进行分类:
使用此代码
ii=1
101 read(20,*,end=102)ra(ii),dec(ii),mag_g(ii),mag_r(ii),mag_i(ii),redshift(ii)
do i=1,n
z(i)=zmin+(i-1)*step
zup(i)=z(i)+step
do j=1,b !mag loop
mag(j)=mag_min+(j-1)*bin
magup(j)=mag(j)+bin
if (z(i) >= redshift(ii).and.redshift(ii) <= zup(i).and.mag(j) >= mag_i(ii).and.mag_i(ii) <= magup(j) ) then
array(i,j)=mag_i(ii)
write(4,'(2x,3f10.5,2x,4f10.5)')z(i),zup(i),redshift(ii),mag(j),magup(j),mag_i(ii),array(i,j)
else
goto 103
end if
end do
end do
103 ii=ii+1
goto 101
102 total=ii-1
当我运行此代码时,它会覆盖每个维度中的所有值。 如何定义一个秩为s的二维数组(所有对象都适合if条件)。
谢谢
答案 0 :(得分:0)
如果元素数量(索引ii
)先验已知,我会建议以下内容:
! Allocate array
allocate( array( n, b, nElements ), stat=ierr )
if ( ierr .ne. 0 ) stop 'Cannot allocate memory!'
! Initialize array
array = 0
! Main loop
do ii=1,nElements
read(20,*,iostat=ierr)ra(ii),dec(ii),mag_g(ii),mag_r(ii),mag_i(ii),redshift(ii)
if ( ierr .ne. 0 ) stop 'Cannot read from unit 20!'
! Original loop
do i=1,n
z(i)=zmin+(i-1)*step
zup(i)=z(i)+step
do j=1,b !mag loop
mag(j)=mag_min+(j-1)*bin
magup(j)=mag(j)+bin
if (z(i) >= redshift(ii) .and.&
redshift(ii) <= zup(i).and. &
mag(j) >= mag_i(ii).and. &
mag_i(ii) <= magup(j) ) then
! Write value
array(i,j,ii)=mag_i(ii)
write(4,'(2x,3f10.5,2x,4f10.5)') z(i),zup(i),redshift(ii), &
mag(j),magup(j),mag_i(ii),array(i,j,ii)
end if
end do ! j
end do ! i
enddo ! ii
! [...]
! Clean up
if ( allocated(array) ) deallocate(array)
当然,这是Fortran 90/95,因此如果需要,您需要将其转换为Fortran 77。
如果元素的数量不已知,您可以使用链式列表(根据问题可能会超大),或者定义上限并使用上面的代码。然后,您需要将循环中的stop
语句更改为exit
语句并存储实际的元素数。
如果您正在处理大型数组,我强烈建议您更改维度的顺序:
! Allocate array
allocate( array( b, n, nElements ), stat=ierr )
if ( ierr .ne. 0 ) stop 'Cannot allocate memory!'
! [...]
array(j,i,ii) = mag_i(ii)