-1

我有目录,我需要在数组中对其值进行分类:
使用此代码

       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 条件)。

谢谢

4

1 回答 1

0

就像 Stefan 说的那样——你需要一个 3D 阵列。我发现您的代码存在几个可能的问题:

  • 行长(我不确定 gfortran 是否会使用默认设置编译它)
  • 转到而不是循环
  • 边界/尺寸不明确
  • 并非每个元素都可以设置
  • 维度的顺序(Fortran 是主要列)

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)
于 2013-09-01T18:50:37.600 回答