3 に答える
マークが指摘しているように、定義で使用できるためii
、構成内で定義する必要はありません。さらに別の方法として、 を使用することに完全に慣れている場合は、 (または) を使用してインデックスを設定できます。forall
a((i+1)/2)
forall
pure function
elemental 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
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
しかし、これは例が単純化しすぎているためだと思いますか? :)