0

これは Fortran からのフォローアップの質問です: Open, form='(un)formatted', read . 特定の基準の下で要素の数を保存する配列を作成する必要があります。

program location
implicit none
interface
    function distkm(deglat1,deglon1,deglat2,deglon2)
    real :: distkm
    real, intent(in) :: deglat1,deglon1,deglat2,deglon2
    end function distkm
end interface
integer, parameter :: maxnr = 200000
integer :: nr, i, j, ios
character(len=1) :: junkfornr
real :: start, finish
! My variable declaration
character(len=15), dimension(:), allocatable :: key
real, dimension(:), allocatable :: lat, lon
integer, dimension(:), allocatable :: jobs
! Secondary arrays
integer, dimension(:), allocatable :: jobs_within
    integer, dimension(:), allocatable :: sum_jobs
! Determine total number of lines in file
nr=0
open(10, file='location_data2.txt', status='old')
do i=1,maxnr
    read(10,*,iostat=ios) junkfornr
    if (ios/=0) exit
    if (i == maxnr) then
        stop
    endif
    nr = nr + 1
end do
! Create variables: key, lat, lon, jobs
allocate(key(nr))
allocate(lat(nr))
allocate(lon(nr))
allocate(jobs(nr))
allocate(jobs_within(nr))
allocate(sum_jobs(nr))
rewind(10)
do i=1,nr
    read(10,*) key(i), lat(i), lon(i), jobs(i)
end do
do i=1,nr
    do j=1,nr
        if (distkm(lat(i),lon(i),lat(j),lon(j)) <= 0.3) then
            jobs_within(j) = jobs(j)
        else
            jobs_within(j) = 0
        end if  
    end do
    sum_jobs(i) = sum(jobs_within)
end do
close(10)
open(20,file='key_sum_jobs_0.3.txt')
do i=1,nr
    write(20,100) key(i), sum_jobs(i)
end do
100 format(A15,I6)
end program location

do ループは、各企業の労働者の合計を 0.3 km 以内に保存します。ここで、企業ごとに、0.3 キロメートル以内にある企業の数が異なります。n_neighbor各企業の隣接する企業の数を記録する配列 (たとえば ) を作成するにはどうすればよいでしょうか?

編集: 次の方法で問題が解決すると思います:

do i=1,nr
    n_aux(1:nr) = 0
    do j=1,nr
        if (distkm(lat(i),lon(i),lat(j),lon(j)) <= 1) then
            jobs_within(j) = jobs(j)
            n_aux(j) = n_aux(j) + 1
        else
            jobs_within(j) = 0
        end if
    end do
    write(20,100) key(i), sum(jobs_within), sum(n_aux)
    100 format(A15,I8,1X,I3)
end do

整数配列 ( n_aux) を作成します。次に、 の出力テキスト ファイルには、unit=20(1) 企業キー、(2) 0.3km 以内の労働者の合計、(3) 0.3km 以内の企業数の 3 つの列が保存されます。

n_aux考慮事項:ループ0の すべての要素を設定しました。次に、条件が成立するところjに投げます。配列に値を動的に割り当てるなどの観点から、この操作を表現する他の方法があるはずですか?1'sif

4

2 に答える 2

1

まず、あなたのコードは二重の do ループでわずかに非効率的です。会社が 5 つしかない場合、ループはそれらを次のようにカウントします。

(1,1)、(1,2)、(1,3)、(1,4)、(1,5)

(2,1)、(2,2)、(2,3)、(2,4)、(2,5)

(3,1)、(3,2)、(3,3)、(3,4)、(3,5)

(4,1)、(4,2)、(4,3)、(4,4)、(4,5)

(5,1)、(5,2)、(5,3)、(5,4)、(5,5)

場所 1 から場所 1 までの距離は、同じ会社であるため 0 になるため、おそらく計算したくないでしょう。(2,1)の作業はすでに完了しているので、おそらく数えたくないでしょう(1,2)。代わりにできることは

do i=1,nr
   do j=i+1,nr
      ...
   enddo
enddo

(1,2) ただし、 をカウントし たい場合は、次のようにする必要が(2,1)あります。

do i=1,nr
   do j=1,nr
      if(j == i) cycle
      ...
   enddo
enddo

これはスキップj=iして に移動しj=i+1ます。


あなたの実際の質問に関しては、1D配列、つまりallocate(n_neighbor(nr))必要なものだと思います。隣接が同じ 0.3 km 以内にあると見なす場合、次のことができます。

if(distkm(lat(i), lon(i), lat(j), lon(j)) <= 0.3) then
   jobs_within(j) = jobs(j)
   n_neighbors(j) = n_neighbors(j) + 1
else
   jobs_within(j) = 0
endif

を初期化した場所n_neighbors=0

私はあなたの問題の文脈をよく理解していませんが、 のインデックスはjobs_withinすべきであり、すべきiではなくj、おそらくそれらを合計したいと思うようですjobs_within(i) = jobs_within(i) + jobs(j)。そうでない場合は、コメントを無視してください。

于 2013-11-14T13:41:44.303 に答える
0

あなたが本当に何を望んでいるのかは完全にはわかりませんが、次のように書けるかのように聞こえます。

n_neighbor(j)=jobs(j) 

あなたの他の部分で。より良い回答が必要な場合は、コードから不要なものをすべて削除してください。そして、jobs_within で行ったのと同じ方法で合計してください。

于 2013-11-14T10:06:25.610 に答える