5

为了在Fortran中对数组进行初始化和赋值,我们执行以下操作:

初始化:

真实(种类=8)::r(3,4)
...
r(:,:) = 0.0_8

如果我们只使用

真实(种类=8)::r(3,4)
...
r = 0.0_8

如果我们这样做怎么办:

真实(种类=8)::r(3,4)
...
r = 0

也适用于以下情况:

真实(种类=8)::r(3,4),q(3,4),p(30,40)
...
q = 0
r = q
r = p(1:3,21:24)

我们更喜欢这样做:

真实(种类=8)::r(3,4),q(3,4),p(30,40)
...
q = 0.0_8
r(:,:) = q(:,:)
r(:,:) = p(1:3,21:24)

我们不确定,所以希望您为您喜欢的每一个提供一些理由

4

2 回答 2

11

对于在 Fortran 中有效使用数组的一般注意事项(包括声明和分配),我建议阅读.

为了更准确地回答您的问题,几个月前我做了一些您可能感兴趣的测试。这是结果。这是我在 Linux Archlinux x86-64 上使用 GNU Fortran (GCC) 4.6.1 20110819(预发行版)没有优化选项的个人笔记本电脑上的测试。

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
于 2012-01-12T23:17:21.253 回答
7

你认为“kind=8”是指8个字节吗?并非所有编译器都是如此。最大可移植性是使用 selected_real_kind 内在函数来定义 kind 值来实现的:

integer, parameter :: DRK = selected_real_kind (14)

在您列出的一些选项中,我更喜欢 r = 0.0_8或更好r=0.0_DRK。这定义了整个数组。在这种情况下不需要指定数组部分,因为您调用的是整个数组:r (:, :)。Steve Lionel 讨论了为什么尝试使用 ":" 使数组变得明显不是一个好主意——数组数组 (:)之间存在差异。作为一个论点,第一个声明了维度,而第二个总是从 1 开始——参见http://software.intel.com/en-us/blogs/2008/03/31/doctor-it-hurts-when -我做这个/

由于r是实数,因此r=0意味着转换。对于零值,这几乎肯定无关紧要,但它可能与其他值产生重要差异。例如,

r = 3.1415927654

r = 3.141592654_8

将给出不同r的值,因为常量不同,第一个在赋值之前被转换为单精度。

于 2012-01-12T04:28:12.457 回答