首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Fortran代码中实现二维数组到一维数组的转换?

如何在Fortran代码中实现二维数组到一维数组的转换?
EN

Stack Overflow用户
提问于 2018-08-19 04:43:07
回答 3查看 3.8K关注 0票数 3

如何将r(i,j)转换为一维数组,以便轻松地对数字进行排序?

program sort
  implicit none
  character CN*8,O*7
  integer j,iconf,nconf
  integer i,nbins,t
  integer n,nmax,ind,num,b
  parameter (n=216)
  double precision xbox,rq
  parameter (nmax=3091,nconf=1)
  double precision atom(nmax),id(nmax),ox(nmax),oy(nmax),oz(nmax)
  double precision xij,yij,zij,rij
  double precision r(n,n),A(n)
  open(unit=10,status='unknown',file='1000.gro')
   do iconf= 1,nconf
    write(*,*)iconf
     read(10,*)
     read(10,*)
   do i=1,n
     read(10,'(A8,A7,1i5,3f8.3)')CN,O,num,ox(i),oy(i),oz(i)
   enddo
     read(10,*)xbox        ! read the xbox for PBC

  open(unit=3,file='dist.txt')

   do i=1,n
    do j=1,n
   if(i .ne. j) then
   xij=ox(i)-ox(j)
   yij=oy(i)-oy(j)
   zij=oz(i)-oz(j)
   r(i,j)=dsqrt(xij**2 + yij**2 + zij**2)
      write(3,'(i3,2x,i3,4x,f17.15)') i,j, r(i,j)
    endif 
    enddo
    enddo
    enddo
    END

我必须计算距离,并将其保存在数组中作为r (i,j)。我想要将r(i,j)转换为一维数组,这样我就可以轻松地对r(i,j)进行排序。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-19 18:23:06

这似乎是为重塑函数量身定做的:https://gcc.gnu.org/onlinedocs/gfortran/RESHAPE.html在这个小示例中,首先使用reshape来生成一个二维数组A,然后再次调用reshape来生成一维数组C。

Program reshape_demo
    use, intrinsic :: iso_c_binding

    implicit none
    real(kind=c_float),allocatable :: A(:,:),C(:)
    integer(kind=c_int) :: krow
    allocate(A(3,3))
    A=reshape((/1,2,3,4,5,6,7,8,9/),(/3,3/))
    do krow=1,3
       write(*,fmt="(1p3e10.3)")A(krow,:)
    end do
    C=reshape(A,(/9/))
    write(*,fmt="(9(1x,f4.1))")C
End Program reshape_demo
票数 3
EN

Stack Overflow用户

发布于 2018-08-19 06:04:40

您可以将r(1,1)传递给子例程,该子例程将参数声明为一维数组。这在Fortran中是合法的(有一些限制不适用于您的代码),并使用一个称为“序列关联”的功能。

票数 3
EN

Stack Overflow用户

发布于 2021-12-09 15:55:17

这样做,你将丢失所有关于距离所对应的对的信息,但如果只是你想要的距离,那么我不会得到所有令人费解的答案。为什么不干脆这样做:

[....]

    implicit none
    real(8), dimension(:), allocatable:: dist_arr

    allocate(dist_arr(n**2))

    k=0
    do i=1,n
        do j=1,n
            k=k+1
            dist_arr(k)=r(i,j)
        enddo
    enddo

[....]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51912396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档