1
4

3 に答える 3

2

マークが指摘しているように、定義で使用できるためii、構成内で定義する必要はありません。さらに別の方法として、 を使用することに完全に慣れている場合は、 (または) を使用してインデックスを設定できます。foralla((i+1)/2)forallpure functionelemental function

program forall_test
   ...
  forall(i=1:20)
     b(i) = a(set(i))
  end forall 

contains
  pure function set(i)
    integer, intent(in) :: i
    integer :: set
    set = (i+1)/2
  end function set
end program

これをa=(/1, 2, 3, 4, 5, 6, 7, 8, 9, 10/)で使用すると、出力として得られます

1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10
于 2013-09-11T15:30:04.500 に答える
2

forall私が自然にdoループを使用する場所を使用しているようです:

do i=1,20
  ii=(i+1)/2
  b(i)=a(ii)
end do

このforallステートメントは、配列全体の割り当てにマスクを適用する条件付きワンライナーに特に役立ちますが、それでも個人的にはdoループを好みます。

forall (i=1:10, j=1:10, i<=10)最終的な式は値をマスクしないため、あなたの例もあまり意味がありません。

配列全体の代入の背後にある考え方forallは、コンパイラが全体をより適切に最適化する方法を知っているということですが、実際には (少なくとも、最後に私が個人的にチェックして以来)、通常はコードが遅くなります。

編集:

aを使用してメモリから同じものを再度フェッチするのではなく、計算された整数をbの配列値に直接割り当てる方がおそらく良いことに言及したかっただけです。

do i=1,20
  b(i)=(i+1)/2
end do

しかし、これは例が単純化しすぎているためだと思いますか? :)

于 2013-09-11T11:58:15.587 に答える