2012-01-12 3 views
2

をアレイに値を割り当てる:Fortranの:私たちは、次のようにしてくださいFortranの</strong><strong>での初期化や配列に値を初期化し、割り当てるには

初期化:我々は唯一

を使用する場合はどのような

 
real(kind=8):: r(3,4) 
... 
r(:,:) = 0.0_8 

 
real(kind=8):: r(3,4) 
... 
r = 0.0_8 

とすれば、

 
real(kind=8):: r(3,4) 
... 
r = 0 

には、また、事態のために:私たちはそうあなたは私たちにあなたがを好むそれぞれのためのいくつかの理由を提供願って確認されていません

 
real(kind=8):: r(3,4), q(3,4), p(30,40) 
... 
q = 0.0_8 
r(:,:) = q(:,:) 
r(:,:) = p(1:3,21:24) 

 
real(kind=8):: r(3,4), q(3,4), p(30,40) 
... 
q = 0 
r = q 
r = p(1:3,21:24) 

私たちのように行うことを好みます。

答えて

6

「kind = 8」は8バイトを意味すると思いますか?それはすべてのコンパイラでは当てはまりません。最大の移植は一種の値を定義するために固有のSELECTED_REAL_KINDを使用して達成される:

あなたがリストのオプションのうちのいくつかの
integer, parameter :: DRK = selected_real_kind (14) 

が、私は r = 0.0_8、またはより良いr=0.0_DRKを好みます。 これは配列全体を定義します。配列全体を呼び出すので、この場合は配列セクションを指定する必要はありません:r(:、:)。スティーブライオネルは、配列を ":"で明白にしようとするのは良い考えではないという議論があります。配列配列(:)の違いがあります。引数として、第一の第二は、常に1で始まりながら、それは、寸法を宣言した - Rが実数であるためhttp://software.intel.com/en-us/blogs/2008/03/31/doctor-it-hurts-when-i-do-this/

を参照して、= 0rが変換することを意味します。値ゼロの場合、これはほとんど問題ではありませんが、他の値との重要な違いを生む可能性があります。定数は、割り当て前単精度に変換される第一の異なるため、例えば、

r = 3.1415927654 

r = 3.141592654_8 

rに異なる値を与えます。

+2

8は8つのバイトと等価ではない=種類約一部に、過去に多くの議論されています。ある種の型は整数で指定されるべきではないという一般的な意見が多少あります。それは多くの混乱を引き起こします。 – Rook

7

Fortranで効率的に配列を使用することに関する一般的な考慮事項(宣言と代入を含む)については、thisを読むことをお勧めします。

あなたの質問へのより正確な回答は、I did some tests some months agoに興味があります。ここに結果があります。これは、GNU Fortran(GCC)4.6.1 20110819(リリース前)のLinux Archlinux x86-64のパーソナルラップトップでの最適化オプションのないテストです。

do i = 1 , 100 
    do j = 1 , 100 
    do k = 1 , 100 ! innest is fastest 
     array (i , j , k) = 0.0d0 
    end do 
    end do 
end do 
! reference time : 1.00 

do i = 1 , 100 
    do j = 1 , 100 
    do k = 1 , 100 
     array (k , j , i) = 0.0d0 
    end do 
    end do 
end do 
! time : 0.499 

array = 0.0d0 
! time : 0.250 

array (: , : , :) = 0.0d0 
! time : 0.250 
+0

こんにちはマックス、あなたの作品へのリンクが壊れています。さらに、最適化をオフにして比較すると明らかになるのはわかりません。ここの内側のループは簡単に最適化されます。多くの場合、2,3,4の例は最適化モードで同じになります。 –

+0

私は時間差は、配列がメモリに格納されている方法によると思います。 Fortranでは、例えば2次元の行列を取ると、C++の場合である行ベクトルの代わりに列ベクトルが連続して格納されます。 –

関連する問題